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

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

但这和这个有什么区别呢?

public string foo { get; private set; }
有帮助吗?

解决方案

在简单的情况下,类似于它的同样但在更复杂的情况下,您在获取和设置中需要额外的代码或您需要额外的代码,因此您需要成员EX:

private string _name;
public string Name
{
   get{ return _name; }
   set
   {
      SomeHandler("Name", value);
      _name = value;
   }
}
.

其他提示

只要属性实现实际上除了获取和设置之外不执行任何操作,差异就很小。使用它的原因可能是:

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

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

在引入“自动属性”之前,我们需要为Proproerties使用一些“备份字段”。大多数情况下,Propoerties将简单地将值返回到“备份字段”的值,如下示例中。

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

引入“自动属性”,我们可以简单地忽略“备份”(或者我们不需要提供一个)。如果您的设计就像上面的示例,这主要是合适的,但如果您需要在检索值或设置值之前执行一些“善良”的自定义逻辑,我们仍然需要遵循“良好的旧设计”(即备份字段)

不同的场景提供了各种优点。

string _FirsName;   
string _LastName;   

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

public string ReverseName 
{ 
   get 
   { 
      return _LastName + ", " + _FirsName;
   }
   set; 
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top