c# - 我应该使用字段还是属性?

标签 c# properties field

首先,我已经阅读了问题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/

相关文章:

c# - 多个包括使用 Entity Framework 和存储库模式

c# - 组合属性 setter "init and private"(C#9)

php - 获取 PharFileInfo 对象的 fileName 属性

python - Django - 确定传递给模板标签的变量的字段类型

sql - 在 Sql 中从 XML 中提取数据的 SUM

c# - 没有输入参数的匿名函数

c# - 具有可见光标的 WPF 的只读文本框 (.NET 3.5)

Drupal 6 : print all body field content to node template file

c# - 从列表中删除一行

grails - Grails属性