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

时间:2011-03-20 01:44:50

标签: c# properties

我无法理解初始化变量,获取其值之间的区别是什么:

 //define a local variable.
   int i;

   i= 0;
   Console.WriteLine(i);

和得到;组;用法:

public int i
{
   get;
   set;
}

i = 0;
Console.WriteLine(i);

我读过一些文章,但不明白我什么时候会用它。

9 个答案:

答案 0 :(得分: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;

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


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

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

答案 1 :(得分:14)

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

Eric Lippert addresses the topic. Twice.

答案 2 :(得分:9)

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

宣传encapsulation

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

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

答案 3 :(得分:8)

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

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

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

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

int MyVar
{
    get;
    set;
}

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

答案 4 :(得分:7)

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

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

答案 5 :(得分:2)

public int i {get ; set;}

创建i

类型的自动属性int

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

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

让我感到困惑的是accessormutatorproperty以及{ get; set; },似乎是使字段{ {1}}。

  • 访问器 =用于访问public字段的方法(在C#中,两个getter/setter
  • mutator =更改private字段(仅setter)的方法
  • 属性 =与C#中的private相同。

完全是:

accessor

它们 完全没有用,用作以下方面的噪声代码版本:

private int myNumber;
public int MyNumber { get; set; }

但是,如果您添加了某些检查,例如:

public int myNumber;

..然后他们实际上满足常规的吸气剂/吸气剂目的。

答案 8 :(得分:0)

这是面向对象的概念之一。

使用Get \ Set属性有两个主要优点:

  1. 在不影响基类值的情况下,我们可以使用get和set方法更改派生类中的变量值。

例如:

class User
{

    private string name = "Suresh Dasari";
    public string Name
    {
     get
        {
            return name.ToUpper();

        }

        set
        {
       if (value == "Suresh")
             name = value;
       }
        }
    }
  1. 此外,我们还可以在“值设置属性”部分中验证\限制\引发事件。