什么时候使用get; 组; 在c#中

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

//define a local variable. int i; i= 0; Console.WriteLine(i); 

得到; 组; 用法:

 public int i { get; set; } i = 0; Console.WriteLine(i); 

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

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

  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; 

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


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

  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; } } 

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

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

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

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

 int _myVar; int MyVar { get { return _myVar; } set { _myVar = value; } } 

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

 int MyVar { get; set; } 

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

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

这是为了促进封装 。

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

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

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

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

 public int i {get ; set;} 

创建int类型的auto属性i

这是短的

 private int _i; public int i { get{ return _i;} set{ _i = i} } 

它基本上是面向对象编程的概念。

当你使用int i时; (这视为字段,此字段可以是内部使用,也可以根据访问修饰符从外部当前类使用。(公共,私有,受保护)

现在当你使用get; 组; 它是阶级的财产。 它也可以从其他类设置,但不同的是它是类似方法的访问,它提供其他function,如属性更改通知和所有这些。

如果您不想对其进行任何控制但是如果您想要控制然后使用属性,请使用归档。 此外,你可以获得和设置公共,私人和受保护,这也可以提供更大的灵活性。