C#中的属性

Bé *_*a 3 16 c# properties accessor

为什么我们能写

public int RetInt
{
   get;set;
}
Run Code Online (Sandbox Code Playgroud)

代替

public int RetInt
{
   get{return someInt;}set{someInt=value;}
}
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?

Hab*_*bib 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; }
Run Code Online (Sandbox Code Playgroud)

对于你的问题

两者有什么区别?

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

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
}
Run Code Online (Sandbox Code Playgroud)

使用自动实现的属性无法完成上述操作.

另一个可以看出区别的是初始化自定义类类型属性.

如果你有MyClass Normal 列表,那么在Normal属性的情况下,它的支持字段可以被初始化/实例化而不是构造函数.

private List<MyClass> list = new List<MyClass>();
public List<MyClass> List
{
    get { return list; }
    set { list = value; }
}
Run Code Online (Sandbox Code Playgroud)

如果是Auto实施的属性,

public List<MyClass> SomeOtherList { get; set; }
Run Code Online (Sandbox Code Playgroud)

您只能SomeOtherList在构造函数中初始化,而不能在Field级别执行此操作.

  • @AshBurlaczenko,他们的问题是为什么这是允许的,REASON - >它的Auto实现属性,两者之间的区别,我只是添加到我的答案 (8认同)

Tig*_*ran 7

这两者有何不同?

有不同的至少 2点:

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

换句话说:如果您需要"只是属性",请使用自动属性,如果您需要对工作流程进行更多控制(引发事件set,调试,运行其他内容),请使用"普通"属性.