这些微不足道的属性让我感到悲伤。它们是最糟糕的模拟行为,而且 C# 中对公共字段的厌恶需要停止。公共字段最大的争议在于未来的可扩展性:如果您之后决定需要为 getter 和 setter 添加额外逻辑,则必须在使用该字段的任何其他代码中进行大规模重构。这在其他语言如 C++ 和 Java 中肯定是正确的,因为调用 getter 和 setter 方法的语义与设置和获取字段的语义非常不同。然而,在 C# 中,访问属性的语义与访问字段的语义完全相同,因此您的 99% 代码应该完全不受此影响。
我见过的唯一一个将字段更改为属性实际上是源代码级别的破坏性变化的例子是:
TryGetTitle(out book.Title); // requires a variable
我必须问一下,为什么你要将其他类的字段作为引用传递?假设这不是一个属性似乎是真正的编码错误。假设你可以直接写入另一个类中的数据,而你对该类一无所知,这是一种不好的实践。创建自己的本地变量并从中设置
book.Title
。任何像这样做的代码都应该被打破。
我看到的其他反对意见:
将字段更改为属性会破坏二进制兼容性,并需要重新编译使用它的任何代码:如果您正在编写用作闭源库分发的代码,则这是一个问题。在这种情况下,请确保您的用户界面类没有公共字段,并根据需要使用简单的属性。但是,如果您像 99% 的 C# 开发人员一样仅为项目内部使用而编写代码,那么为什么重新编译是一个大问题呢?您所做的任何其他更改都将需要重新编译,那又怎样呢?我最后一次检查是不是 1995 年了,我们有快速的计算机、快速的编译器和增量链接器,即使进行较大的重新编译,也不需要超过几分钟的时间,而且很长一段时间以来,我就无法再使用“我的代码正在编译”作为
在办公室中打架 的借口。
您无法对变量进行数据绑定:很好,当您需要这样做时,请将其转换为属性。
属性具有使它们更适合调试的功能,例如反射和设置断点:很好,当您需要使用其中一项功能时,请将其转换为属性。完成调试并准备发布后,如果您不再需要这些功能,请将其改回字段。
属性允许您在派生类中覆盖行为:很好,如果您正在制作一个基类,在其中您认为这种情况很可能发生,请将适当的成员转换为属性。如果您不确定,请将其保留为字段,稍后可以更改。是的,那可能需要一些重新编译,但又怎样呢?
总之,是的,有一些微不足道属性的合法用途,但除非你正在制作一个闭源库以供公开发布,否则当需要时将字段转换为属性很容易,而对公共字段的非理性恐惧仅是一些面向对象教条主义,我们最好摆脱它们。
prop
代码片段能够快速创建属性。只需要输入prop
然后按 Tab 键即可。 - Tono Nam