我关于 set 和 get 方法的问题.. 虽然我知道如何使用以及为什么使用它,但我无法理解这些使用样式之间的主要区别......
public string a{get;set;}
public string a
{
get{return a;}
set{a=value;}
}
我关于 set 和 get 方法的问题.. 虽然我知道如何使用以及为什么使用它,但我无法理解这些使用样式之间的主要区别......
public string a{get;set;}
public string a
{
get{return a;}
set{a=value;}
}
第一种形式是C#中自动实现的属性
在 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;
}
}
(目前您的第二种形式的属性会导致 stackoverflow 异常,因为它将进入无限循环)
第一个将生成一个隐式字段,您的值将被写入和读取。这些被称为“自动实现的属性”。而在第二个中,您明确命名您的属性将写入和读取的字段。来自MSDN:
在 C# 3.0 及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还使客户端代码能够创建对象。当您如下例所示声明属性时,编译器会创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器访问。
您的实施
public string a
{
get{return a;}
set{a=value;}
}
StackoverflowException
当您在-accessor中a
递归调用时,将导致 a 。get
将其更改为
private string a;
public string A{
get{ return a; }
set{ a = value; }
}
如果您想编写更少的代码,请使用第一种形式,称为自动属性。在幕后,编译器将为您创建支持字段。
如果您在财产中有一些处理,请使用标准方式
public string A{get;set;} //Auto property
public string A
{
get{return a;}`
set{
//Do some check-Processing
if(value != null)
a=value;
}
}
让我们举个例子:
private string _chars;
public string Chars
{
get { return _chars; }
set
{
DoSomeThingSpecialWhenEdited();
_chars = value;
}
}
DoSomeThingSpecialWhenEdited
可以通过设置_chars
或不让您选择触发或不触发Chars
否则,两者是等价的(注意后者是无限循环)。