何时使用get; 组; 在c#中

The*_*Man 26 c# properties

我无法理解初始化变量之间的区别是什么,得到它的值如下:

 //define a local variable.
   int i;

   i= 0;
   Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

得到; 组; 用法:

public int i
{
   get;
   set;
}

i = 0;
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些文章,但我不明白何时使用它.

Ric*_*III 24

基本上,在这种情况下,没有区别,使用属性的(许多)优点是能够向您的属性添加事件,如下所示:

  public delegate void ChangedEventHandler(object sender, EventArgs e);

  int m_i = 0;
  public int i 
  {
      get { return m_i; }
      set { m_i = value; iChanged(self, null); }
  }

  public ChangedEventHandler iChanged;
Run Code Online (Sandbox Code Playgroud)

这允许代码知道我何时被更改(可能存在一些语法错误,我暂时没有关注C#,但想法类似).这在winforms中非常重要,因为这是了解何时单击按钮(或类似按钮)的主要方式.


此外,这允许属性的setter中的附加功能,例如检查它是否在某个范围内,如下所示:

  int m_i = 0;
  public int i {

  get { return m_i; }
  set { if (value > 10) throw new Exception("I cannot be greater than 10!"); m_i = value; }
  }
Run Code Online (Sandbox Code Playgroud)


Ben*_*igt 15

如果您认为以后可能需要更复杂的getter或setter,则自动属性语法允许您升级而无需重新编译所有调用者.但是,从字段(成员变量)移动到属性是一个重大变化.

Eric Lippert解决了这个话题. 两次.


Gio*_*lbo 9

让我们忘记一秒钟的属性...你问的真正问题(你可能甚至不知道它)是你为什么首先需要属性(或其他语言的getter和setter)?

这是为了促进封装.

属性只是为getter和setter提供了一个更好的语法,也就是访问器(实际上,一个属性只是包装了set()和get()方法).

在c#3中,c#团队提出了自动属性,因为大量属性对变量没有任何作用(没有额外的逻辑),因此自动属性对于该场景来说是短路的.


Kyl*_*man 8

您描述的语法称为自动属性.

在.NET 2.0中引入语法之前,我们创建了一个如下属性:

int _myVar;
int MyVar
{
    get { return _myVar; }
    set { _myVar = value; }
}
Run Code Online (Sandbox Code Playgroud)

.NET 2.0引入了简写语法,允许编译器自动创建支持变量(_myVar在上面的例子中)

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

设置变量和属性之间的关键区别在于我们可以控制属性的获取和设置(例如,只要为属性设置值,就可以读取属性或函数调用.)


小智 8

基本上,它增加了开销以换取附加事件的能力.除此之外,它增加了复杂性和冗长性,这使得代码更难以阅读.如果您需要添加验证处理程序,那么这是一种巧妙的方法.在某些情况下.在大多数情况下,您知道(并且想要知道)确切地修改变量(成员)的位置.如果不这样做,则会出现代码管理问题,而不是语言问题.

一切"面向对象"更好的想法是错误的.大多数开发人员都会明白这一点.我已经做了30年的这项工作,我可以告诉你,100次中有98次 - 简单就更好了.将您的编码工作花在有效的算法上,这些算法不会增加不必要的复杂性,您将走得更远并且能够在趋势中生存