5

我见过大多数人在类中使用成员变量,例如:

string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }

但这和这有什么区别呢?

public string foo { get; private set; }
4

4 回答 4

4

在像这样的简单情况下,它是相同的,但在更复杂的情况下,您触发事件或需要在 get 和 set 中添加额外代码的东西,因此您需要成员 ex:

private string _name;
public string Name
{
   get{ return _name; }
   set
   {
      SomeHandler("Name", value);
      _name = value;
   }
}
于 2014-02-25T10:11:14.727 回答
3

只要属性实现实际上除了 get 和 set 什么都不做,差别就很小。使用它的原因可能是:

  • C# 3.0 之前的旧代码(添加了自动属性,即public string Name { get; set; }语法。
  • 期望在某个时候必须更改 getter / setter 的实现。
  • 一些自定义序列化的要求。
  • 出于任何原因在代码中使用基础字段。一个很好的例子可能是使用支持字段作为ref某些方法的参数。这还包括在本机互操作(GCHandle等)中使用值之类的事情。
  • 简单的用户偏好。我通常不使用自动属性,因为我喜欢手动指定支持字段。
  • 使用readonly自动属性时,不可能使用支持字段。

这只是冰山一角。还有很多奇怪的原因,比如必须明确声明该字段,以便有人可以使用反射访问它,无论出于何种原因。

于 2014-02-25T10:18:30.770 回答
1

在引入“自动属性”之前,我们需要为属性使用一些“支持字段”。大多数情况下,Propoerties 将简单地返回值/将值设置为“支持字段”,如下例所示。

public string Name
{
   get { return _name; }
   set { _name=value; }
}

随着“自动属性”的引入,我们可以简单地忽略“支持字段”(或者我们不需要提供)。如果您的设计类似于上面的示例,这最合适,但是如果您需要在检索值或设置值之前强制执行某种“类型”的自定义逻辑,我们仍然需要遵循“良好的旧设计”(即支持字段)

于 2014-02-25T10:18:56.627 回答
0

不同的场景有不同的优势。

string _FirsName;   
string _LastName;   

public string FullName 
{ 
   get 
   { 
      return _FirsName + _LastName;
   }
   set; 
} 

public string ReverseName 
{ 
   get 
   { 
      return _LastName + ", " + _FirsName;
   }
   set; 
}
于 2014-02-25T10:20:13.363 回答