C#自动属性

Gav*_*vin 52 c# automatic-properties c#-3.0

我对C#中的自动属性有点困惑,例如

public string Forename{ get; set; }
Run Code Online (Sandbox Code Playgroud)

我知道你不需要声明私有变量来保存代码,但是当你不使用任何get或set逻辑时,属性的重点是什么?为什么不用

public string Forename; 
Run Code Online (Sandbox Code Playgroud)

我不确定这两个语句之间有什么区别,如果你想要额外的get/set逻辑,我一直认为你使用过属性?

Mat*_*tin 118

属性可以将代码放入其中而不会破坏合同,字段不能将代码放入其中而不将其更改为属性(并破坏接口).属性可以是只读或只写,字段不能.属性可以是数据绑定,字段不能.

  • 简短又甜蜜.加一. (4认同)
  • @Gav,自动属性很简单,而且很笨.要添加逻辑,您必须将其转换为普通属性.get和set都是自动的,或者两者都不是. (4认同)

Skl*_*vvz 15

你可以写

public string Forename{ get; private set; }
Run Code Online (Sandbox Code Playgroud)

获得只读属性......仍然没有真正的属性那么多功能,但它对某些作品来说是一种妥协.


Ree*_*sey 13

我不确定这两个语句之间有什么区别,如果你想要额外的get/set逻辑,我一直认为你使用过属性?

在第一种情况下,编译器将自动为您添加一个字段,并包装该属性.它基本上等同于:

private string forename;
public string Forename
{
    get
    { 
        return this.forename;
    }
    set
    {
        this.forename = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

在字段上使用属性有许多优点.即使您不需要某些特定原因(例如数据绑定),这也有助于为您的API提供面向未来的证明.

主要问题是,如果你创建一个字段,但是在应用程序的v2中,需要一个属性,你就会破坏API.通过预先使用自动属性,您可以随时更改API,而无需担心源或二进制兼容性问题.


小智 6

这意味着您希望稍后添加逻辑.

如果您这样做并从头开始将其作为属性,则不必重建依赖代码.如果将其从变量更改为属性,则必须执行此操作.

  • 这是不正确的.这并不意味着您希望稍后添加逻辑.在任何地方都无意推断这一点.这简直就是让编写正确的代码(属性与字段)更容易做的简写. (2认同)