C#语法问题

C#语法问题,c#,C#,在Main的内部,如果我创建了这个新的人。上面两行完全相同,对吗 否-第一个是字段,第二个是属性。尽可能使用属性,以便以后可以扩展它们,即在setter中添加一些数据验证。属性使用备份字段,自动属性仅为您隐藏此字段 下面是属性设置器中的数据验证示例: public int Age { get; set; } OR public int Age; private int\u age; 公共信息 {get{return} 设置{if(值

在Main的内部,如果我创建了这个新的人。上面两行完全相同,对吗

否-第一个是字段,第二个是属性。尽可能使用属性,以便以后可以扩展它们,即在setter中添加一些数据验证。属性使用备份字段,自动属性仅为您隐藏此字段

下面是属性设置器中的数据验证示例:

public int Age {  get;  set; }

OR

public int Age;
private int\u age;
公共信息
{get{return}
设置{if(值<200)_age=value;}
}

使用属性而不是字段的主要原因之一是应用程序或库的版本控制-如果使用属性,则可以更改属性实现,而无需类或库的用户重新编译其代码,类的公共接口保持不变。另一方面,以后从一个字段到一个属性,最坏的情况下可能是一个突破性的更改(请参阅Dao的列表,使用一个字段作为ref),最坏的情况下至少需要重新编译。

不正确。第一行是自动实现的属性,第二行是公共字段。它们既不是二进制兼容的,甚至在语义上也不完全相同。通常,属性是首选的,因为它们具有灵活性,并且可以用来封装数据(尽管它们经常被滥用)

但就编译器生成的内容而言,该属性创建了一个自动备份字段,本质上创建了两个方法(getter和setter)来访问它。这个领域就是:一个领域

由于这些差异,事实上,您的两个示例有许多不同的行为方式:

  • 该属性将支持UI应用程序中的数据绑定
  • 该字段将可作为
    ref
    out
    参数访问,例如可作为
    联锁方法之一访问
  • 如果不是
    int
    您有一个可变值类型(例如
    Point
    ),该属性将不允许您直接修改该值,因为它将返回字段的副本。(要修改该字段,您需要将属性返回的值赋给局部变量,修改局部变量,然后将其赋回属性。)该字段实际上允许您正确修改该值

  • 作为旁注,上面的第3点是许多开发人员用来反对设计可变值类型的行为类型的一个例子。

    不,它们不一样

    第一个是属性,这意味着将为您创建另一个支持变量,以及getter和setter方法。这些将是无形的。您应该使用此方法,因为这样您就可以轻松地更改getter和setter类的功能(尽管在VisualStudio中,将字段转换为属性非常简单)


    第二个只是一个对每个人都公开的成员变量,这是一个坏主意,因为它破坏了封装。

    为了给出一个实际的例子,说明它们的不同之处,第二个版本不会被序列化或数据绑定到控件,而第一个版本可以

    第一个是自动属性,第二个是“大写”成员变量。封装有利于第一种。在第一种情况下,设置和获取有代码点,尽管是空的

    不,第一个是一个属性,第二个是一个公共实例变量。不,它们对外部代码的作用似乎不一样。尝试通过引用传递属性,或者绑定到它…啊,谢谢。我试图想出一个反例,只是在我失败后才发布。我会移除它。
    private int _age;
    public int Age 
    {  get { return _age; }
       set { if(value < 200) _age = value;}
    }