具有私有设定者的属性与没有设置者的属性之间有什么区别?

svb*_*net 4 .net c# properties

如果我想要一个只读属性,我会写它:

public int MyProperty { get { //Code goes here } }
Run Code Online (Sandbox Code Playgroud)

但是,Microsoft示例(以及我见过的一些其他示例)的编写方式如下:

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

这两者之间有什么区别,我应该开始写这样的属性吗?

Tho*_*mar 8

正如您在第二个示例中所看到的,您可以省略属性的实现.然后,.NET将自动为属性创建一个局部变量,并实现简单的获取和设置.

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

实际上相当于

private int _myProperty;

public int MyProperty { 
    get { return _myProperty; }
    private set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)

写作

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

根本不起作用,因为自动属性需要实现一个getter 一个setter

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

留下可能返回任何属性的属性int,但只能在当前类中更改.

public int MyProperty { get { ... } }
Run Code Online (Sandbox Code Playgroud)

创建只读属性.

问题是:你需要什么?如果您已经有一个在您的类中使用的成员变量,并且您只想使用属性返回当前值,那么您完全可以使用

public int MyProperty { get { return ...; }}
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要一个只读属性,您需要在代码中设置(而不是从其他类),而不显式声明成员变量,您必须采用该private set方法.

  • `public int MyProperty {get; 你不会留下任何财产; 那是非法的. (7认同)
  • `public int MyProperty {get; 从C#6起,它是合法的 (4认同)

gza*_*axx 5

使用私有setter时,只能在没有setter的情况下在实例内部分配属性值,不能在任何地方设置其值.