关于set和get方法的问题.. 虽然我知道如何使用以及为什么使用它,但我无法理解这些使用样式之间的主要区别......
public string a{get;set;}
public string a
{
get{return a;}
set{a=value;}
}
答案 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
否则,两者是等价的(注意后者是无限循环)。