为什么在C#getter / setters中使用私有变量?

我一直都看到这个:

private int _myint; public int MyInt { get { return _myint; } set { _myint = value; } } 

对我而言,这似乎与:

  public int MyInt{ get; set; } 

那么为什么每个人都做前者…为什么私人VAR?

首先,这是C#3.0的新function,它在此之前并不存在。 其次,如果你想为你的getter和setter添加任何自定义逻辑,你别无选择。 所以,是的,在你没有自定义逻辑的例子中,它是相同的东西(实际上编译器在幕后为你生成)但是如果你想举例,或者类似的东西,你必须明确关于它。

我想看

 public int MyInt{ get; private set; } 

更多, ;)

但@BFree钉了它

首先,您使用的语法是新的。 它在早期版本的C#中不存在。

其次,如果您要使用默认值,或者延迟加载结果,则需要私有变量。

扩展@BFree所说内容的一个例子:

 private int _Whatever; public int Whatever { get {return _Whatever;} set { if(value != _Whatever) { // It changed do something here... // maybe fire an event... whatever } _Whatever = value; } } 

你喜欢那些你不知道弄乱私人部位的人吗? 我希望不是。 这是一种提供基本上代理你所拥有但不想放弃控制权的方法。 如果您决定要validationint是否为正数,则可以在显示代码时开始执行此操作。

C#现在使用自动属性使其透明。

在C#3之前,这是唯一的方法。 隐式类型的属性尚不可用。 人们仍然希望抽象出私人成员。 如果开发人员仍然在C#3中这样做,他们要么不知道新的更改,要么需要提供自定义的get / set逻辑。

这是旧方法。 你喜欢的方式(“自动属性”)它是一种相对较新的语言结构。 几年前,我们总是不得不使用私有变量。

使用私有变量可能还有其他原因,但不是在您提供的简单示例中。 例如,如果您需要使用默认值初始化该属性,则无法使用自动属性进行干净利落; 相反,你需要在构造函数中初始化。

 public int MyInt{ get; set; } 

是C#3.0中添加的一项名为“自动属性”的function。 C#2.0不支持这一点,并且要求私有变量具有显式的getter和setter。 因此,许多旧代码或向后兼容代码将使用显式getter和setter。

如果您使用reflection器等工具查看编译器生成的输出,则会添加私有字段