自动属性问题

时间:2010-01-15 08:57:49

标签: c#-3.0 automatic-properties

目前我正在使用.Net 3.0,但我不知道如何使用自动属性。

例如,如果我想通过Authomatic Properties编写此示例代码,我该怎么办?

private string _name = string.Empty;
private string _family = string.Empty;
//A field with default value
private DateTime _releaseDate = System.DateTime.Now;


//ReadOnly Property
public string Name
{
    get {return _name; }
}

//enforce validation rules on setting 
public string Family
{
    get { _family; }
    set
    {
        if (value.Length < 3)
            return new Exception("Family need at least 3 character long");
        else
            _family = value;
    }
}

// A property from two other fields
public string FullName
{
    get { return _name + " " + _family; }
}

谢谢大家的回复,我得到了答案

4 个答案:

答案 0 :(得分:6)

你做不到。

自动属性只是为您创建一个私人支持字段,并将其隐藏。如果您需要在您的财产中拥有逻辑,您应该自己实施。

使用自动属性,你必须同时拥有一个getter和一个setter,但你可以将setter设为私有,例如:

public string Foo { get; private set; }

顺便说一下,你不能从字符串属性返回异常。例外应为 抛出 ,而不是已退回

public string Family
{
    get { _family; }
    set
    {
        if (value.Length < 3)
            return new Exception("Family need at least 3 character long");
        else
            _family = value;
    }
}

这应该是:

public string Family
{
    get { _family; }
    set
    {
        if (value.Length < 3)
            throw new Exception("Family need at least 3 character long");
        else
            _family = value;
    }
}

答案 1 :(得分:3)

您说您使用的是.NET 3.0 - 您使用的是VS2005吗?如果是这样,您使用的C#2不支持自动实现的属性。

如果您正在使用VS2008并且目标是.NET 3.0,那么它们应该可以正常工作 - 但无论如何它们实际上并不适用,因为您的属性都不是“微不足道”的属性。自动实现的属性是一种紧凑的写作方式:

private string foo;
public string Foo { get { return foo; } set { foo = value; } }

如果您的属性不遵循该模式(属性的模访问修饰符),那么自动属性将无法帮助您。

答案 2 :(得分:3)

你做不到。自动属性不能只读,也不能包含正文中的逻辑。

自动属性只是此

的简短形式
private string _name;
public string Name
{
   get{return _name;}
   set{_name = value;}
}

到此

public string Name{get;set;}

答案 3 :(得分:2)

当您只想要一个属性“重复”一个支持字段时,就会使用自动属性。

string _name;
public string Name { get { return _name; } set { _name = value; } }

可以简单地重写为

public string Name { get; set; }

编译器会为您扩展一个随机命名的专用后备字段,并编写与第一个代码示例等效的代码。

但是,如果您想要执行任何特殊操作(例如默认值)或验证集value,则无法使用它们。

实际上,可能的例外是默认初始化。

您可以使用构造函数来默认初始化属性。