为什么要封装这个字段?

Gab*_*ira 6 c# oop standards encapsulation coding-style

我总是被告知从类中封装任何和所有属性......

这是正确的:

private string propertyName;
public string PropertyName
{
    get { return propertyName; }
    set { propertyName = value; }
}
Run Code Online (Sandbox Code Playgroud)

这是错的

Public string PropertyName;
Run Code Online (Sandbox Code Playgroud)

我看不出需要封装的地方......对我来说,第一个代码就是无用的冗余代码......不需要封装那个字段......

因此,如果任何人都可以证明这个场景的封装是正确的.(我可以理解其他情况).

Joe*_*ite 8

在大多数情况下,公共领域在实践中是可以的.毕竟,如果您以后需要从外部将其设置为只读,或者向其setter添加行为,那么您可以将其更改为属性.因此,您今天可以将其变为公共领域,如果需要,可以在以后进行更改.对?

问题是,在某些情况下,您以后无法安全地更改它:

  • 如果使用公共字段编译Foo.dll,并且有人构建引用Foo.dll的Bar.dll,则以后不能将该字段更改为属性的新版本的Foo.dll.您必须让其他人针对您的新Foo.dll重建Bar.dll.对于一些商店来说,这不是问题; 对于其他人来说,这可能是个大问题.
  • 如果您编写任何反射代码,则反映字段与反映属性非常不同.因此,如果您稍后将字段更改为属性,则您的Reflection代码将会中断.

这两种情况有多重要?可能不是很好.但是先发制人的写作更容易

public string PropertyName { get; set; }
Run Code Online (Sandbox Code Playgroud)

比它要收拾残局,如果你有后来去改变它.

而且没有性能成本.无论如何,JIT编译器将内联getter和setter.所以它没有任何成本,并带来一些好处; 那时,为什么不使用房产呢?

  • 您编写的代码看起来相同,但实际上属性编译成单独的PropertyName_get()和propertyName_set()方法 - 编译器只是隐藏了您的详细信息....至少它隐藏,直到您尝试将字段转换为属性和其他DLL停止工作 (3认同)