关于set和get方法的不同写作风格

时间:2013-08-21 13:41:00

标签: c# oop set getter-setter

关于set和get方法的问题.. 虽然我知道如何使用以及为什么使用它,但我无法理解这些使用样式之间的主要区别......

public string a{get;set;} 

public string a
{
  get{return a;}
  set{a=value;}
}

4 个答案:

答案 0 :(得分:5)

第一种形式是C#中的Auto implemented properties

  

在C#3.0及更高版本中,自动实现的属性生成   当不需要额外的逻辑时,属性声明更简洁   在物业访问者。

当前形式的第二种形式(虽然不正确)需要显式定义支持字段,您可以设置显式代码来设置和读取值。

第二种形式可以是:

private string _a; // a backing field
public string a
{
    get
    {
        return _a;
    }
    set
    {
        if (a != null) //some validation
            _a = value;
        else
            _a = string.Empty;
    }
}

(目前你的第二种形式的属性会导致堆栈溢出异常,因为它会以无限循环进入)

答案 1 :(得分:1)

第一个将生成一个隐含字段,您的值将被写入和读取。这些被称为“自动实现的属性”。而在第二个中,您明确命名属性将写入和读取的字段。来自MSDN

  

在C#3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更简洁。它们还使客户端代码能够创建对象。当您声明一个属性时,如下例所示,编译器会创建一个私有的匿名支持字段,只能通过属性的get和set访问器进行访问。

您的实施

public string a
{
  get{return a;}
  set{a=value;}
}
当您在StackoverflowException - 访问者中递归调用a时,

将导致get

将其更改为

private string a;

public string A{

get{ return a; }
set{ a = value; }

}

答案 2 :(得分:1)

如果您想减少代码,请使用名为auto property的第一个表单。在场景后面,编译器将为您创建支持字段。

如果您在酒店进行了一些处理,请使用标准方法

public string A{get;set;} //Auto property

public string A
{
  get{return a;}`
  set{
//Do some check-Processing
    if(value != null)
       a=value;
    }
}

答案 3 :(得分:0)

我们举一个例子:

private string _chars;

public string Chars
{
  get { return _chars; }
  set 
  { 
    DoSomeThingSpecialWhenEdited();
    _chars = value;
  }
}

通过设置DoSomeThingSpecialWhenEdited_chars

,您可以选择是否触发Chars

否则,两者是等价的(注意后者是无限循环)。