使用具有默认访问权限的自动实现属性而不是使用公共字段有什么优势

本文关键字:什么 字段 访问 默认 访问权 权限 实现 属性 | 更新日期: 2023-09-27 18:19:07

可能的重复项:
C#:公共字段与自动属性
我是否需要将 { get; set; } 与获取和设置时没有特殊操作的 c# 字段一起使用

请考虑以下两个选项:

public int Foo { get; set; }
public int Foo;
它们

似乎在语义上是等效的,我相信它们甚至会编译到同一个 IL。那么使用该属性的优势是什么?看到一个公共字段让我感到不安,但我想不出使用属性语法有什么具体的好处。如果将来需要显式 getter 和 setter,则可以将public int Foo;替换为 public int Foo { ... },而无需进行其他更改。我能想到的最好的是属性语法感觉更好,但我很难用这个理由来说服别人。

在这种情况下使用属性语法有什么好处(如果有的话(?

使用具有默认访问权限的自动实现属性而不是使用公共字段有什么优势

主要优点是:

  1. 让您的 API 面向未来 - 如果您以后需要 getter 或 setter 中的逻辑,您的公共 API 不会更改。
  2. 数据绑定 - 大多数数据绑定框架仅适用于属性,不适用于字段。

优点

  • 轻松申报

缺点

  • 无法在 set/get 内设置breakpoint
  • 不能在get/set中包含代码
  • 不处理 WPF 数据绑定
  • 没有像default value这样的概念,因为它背后没有default field

利弊项目实施密切相关。

只是几个提示,很确定其他人会添加其他东西......

我不相信它们会编译到同一个 IL,因为属性的 get 和 set 实际上是 IL 级别和处理反射时的函数。以下是这样做的一些原因:

  1. 反射!
  2. 序列化
  3. /反序列化仅适用于公共属性,不适用于公共字段。
  4. 调试时,您可以在 get 或集合上设置断点,这有助于跟踪何时访问变量,特别是如果您看到一个愚蠢的值并且您不知道它来自哪里。

我们不使用自动实现的属性的主要原因是那些序列化成员而不是属性的序列化机制(例如 .Net 远程处理的二进制序列化(。

在这种情况下,如果有两个应用程序分别编译同一类并交换该类的序列化副本,则无法保证它将正确反序列化,因为您无法控制私有成员的名称。