16

为什么我们可以写作

public int RetInt
{
   get;set;
}

代替

public int RetInt
{
   get{return someInt;}set{someInt=value;}
}

两者有什么区别?

4

4 回答 4

25

此功能称为自动实现的属性,并在 C# 3.0 中引入

在 C# 3.0 及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还使客户端代码能够创建对象。当您如下例所示声明属性时,编译器会创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器访问

class Customer
{
    // Auto-Impl Properties for trivial get and set 
    public double TotalPurchases { get; set; }
    public string Name { get; set; }
    public int CustomerID { get; set; }

对于你的问题

两者有什么区别?

在你的情况下,没有。由于您在设置或检索值时没有做任何事情,但假设您想要进行一些验证或想要执行其他类型的检查:

private int someInt;
public int RetInt
{
    get
    {
        if (someInt > 0)
            return someInt;
        else
            return -1;
    }
    set { someInt = value; } // same kind of check /validation can be done here
}

以上无法使用自动实现的属性来完成。

您可以看到差异的另一件事是在初始化自定义类类型属性时。

如果MyClass 在 Normal 属性的情况下您有 Th​​en 列表,则可以初始化/实例化其支持字段而不是构造函数。

private List<MyClass> list = new List<MyClass>();
public List<MyClass> List
{
    get { return list; }
    set { list = value; }
}

如果是 Auto 实现的属性,

public List<MyClass> SomeOtherList { get; set; }

您只能SomeOtherList在构造函数中初始化,不能在字段级别进行初始化。

于 2013-01-28T10:25:24.570 回答
7

这两个有什么不同?

至少有两点不同:

  1. 在普通属性中,您必须在之前定义一个字段(someInt在您的情况下)
  2. 在普通属性中,您可以在修饰符中设置断点set/get,而在自动属性中则不能这样做。

换句话说:如果您需要“仅属性”,请使用自动属性,如果您需要对工作流程进行更多控制(在 上引发事件set、调试、在内部运行其他内容),请使用“正常”属性。

于 2013-01-28T10:27:19.813 回答
2

这些是自动实现的属性。请参阅http://msdn.microsoft.com/en-us/library/bb384054.aspx了解更多信息。

引入这些的基本原因是为了减少程序员创建私有变量的开销,比如someInt在属性中使用它几乎没有用处。

于 2013-01-28T10:27:09.043 回答
2

实际上,这些并没有真正的不同,在这两种情况下,您都有一个与您的属性相对应的私有字段,但在第一种情况下,它是由编译器生成并隐藏的。

如果您需要在您的类中经常使用属性后面的变量,我认为最好以旧方式(第二个)声明您的属性,因为每次您访问它时,如果您这样做,这将调用 getter “新方法。

如果您只需要在课堂外使用它(或在大多数情况下),那么您可以采用“新”方式(第一种)

于 2013-01-28T10:30:15.870 回答