0

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

public string a{get;set;} 

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

4 回答 4

5

第一种形式是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 异常,因为它将进入无限循环)

于 2013-08-21T13:42:16.563 回答
1

第一个将生成一个隐式字段,您的值将被写入和读取。这些被称为“自动实现的属性”。而在第二个中,您明确命名您的属性将写入和读取的字段。来自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; }

}
于 2013-08-21T13:42:43.983 回答
1

如果您想编写更少的代码,请使用第一种形式,称为自动属性。在幕后,编译器将为您创建支持字段。

如果您在财产中有一些处理,请使用标准方式

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

public string A
{
  get{return a;}`
  set{
//Do some check-Processing
    if(value != null)
       a=value;
    }
}
于 2013-08-21T13:46:26.070 回答
0

让我们举个例子:

private string _chars;

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

DoSomeThingSpecialWhenEdited可以通过设置_chars或不让您选择触发或不触发Chars

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

于 2013-08-21T13:48:27.750 回答