首先,我已经阅读了问题asking for the difference between fields and properties我知道它的用途。
现在回答我的问题,我想创建一个属性,我确信 get 和 set 都将为空,所以我执行 get;设置;
。一切都很好。但是现在我意识到我刚刚创建了一个大写名称的公共(public)字段,它在所有方面都是相同的。
即使是使用它以便将来的代码不依赖于实现的论点也不能说,因为我可以简单地将它作为一个属性并实现一个 getter 或 setter。 字段和属性的语义在定义它的类之外是相同的。
所以我的问题是,当属性只使用 get;set;
时,我应该使用字段还是属性?
所以这样:
public IEnumerable<string> Products;
在所有方面都与此相同:
public IEnumerable<string> Products { get; set; }
最佳答案
should I use a field or a property when a property would simply use get;set;?
使用属性...出于以下实际原因,以及出于哲学原因,属性公开状态 API,而字段公开状态实现细节。
The semantics of a field and a property are identical outside the class it is defined in.
这不是真的。
- 差异通过反射可见,这通常非常重要。例如,许多绑定(bind)框架不会使用字段,而只会使用属性。
- 您可以通过 ref 传递可变字段,但不能传递属性 - 因此将字段更改为属性会破坏源兼容性。 (当
Products
成为属性时,使用SomeMethod(ref x.Products)
的代码将变得无效。) - 将字段更改为属性也会破坏二进制兼容性,因此如果程序集 X 是针对程序集 Y v1.0 构建的,并且您将字段更改为程序集 Y v1.1 的属性,则你需要重建程序集 X,否则它将无法正确执行
- 如果您有一个可变值类型(请不要这样做),那么当
Location
是一个字段时,编写foo.Location.X = 10
是可行的(因为x.Location
被归类为变量)而当Location
是属性时则不是(因为表达式x.Location
被归类为一个值)。如果你有一个方法(在你邪恶的可变类型中)改为改变值,那么foo.Location.DoSomething()
将在两种情况下编译,但有不同的效果。为全家带来欢乐。
关于c# - 我应该使用字段还是属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516647/