1

目前我正在使用 .Net 3.0 但我不知道如何使用 Automatic Properties 。

例如,如果我想通过 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

4 回答 4

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;
    }
}
于 2010-01-15T09:01:04.080 回答
3

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

如果您使用的是 VS2008 并以 .NET 3.0 为目标,那么它们应该可以正常工作 - 但无论如何它们实际上并不适用于这种情况,因为您的所有属性都不是“微不足道的”属性。自动实现的属性是一种简洁的写法:

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

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

于 2010-01-15T09:01:51.287 回答
3

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

自动属性只是这个的简写形式

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

对此

public string Name{get;set;}
于 2010-01-15T09:02:43.217 回答
2

当您只希望属性“重复”支持字段时,使用自动属性。

IE

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

可以简单地重写为

public string Name { get; set; }

编译器为您扩展了一个随机命名的私有支持字段,并编写了与第一个代码示例等效的代码。

但是,如果你想做一些特别的事情,比如默认值,或者验证一个 set value,那么你就不能使用它们。

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

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

于 2010-01-15T09:02:03.000 回答