30

似乎每个 C# 静态分析器在看到公共字段时都想抱怨。但为什么?当然,在某些情况下,公共(或内部)字段get_就足够了,并且拥有带有其和set_方法的属性没有意义吗?如果我确定我不会重新定义字段或添加字段怎么办(副作用很糟糕,对吗?) - 一个简单的字段不应该足够吗?

4

8 回答 8

42

因为它破坏了封装——这就是大多数人大量使用访问器的原因。但是,如果您认为它是您任务的正确解决方案,请忽略它(意味着严格的封装投诉)并为您的项目做正确的事情。不要让 OO 纳粹告诉你否则。

于 2009-01-26T17:33:41.850 回答
27

这真的是为了让你的代码面向未来。当你说(强调我的):

如果我确定我不会重新定义字段或添加字段怎么办(副作用很糟糕,对吗?) - 一个简单的字段不应该足够吗?

这是一个绝对的陈述,正如我们所知(以及大多数静态分析器),生活中只有两个绝对。

它只是想保护你免受伤害。如果这是一个问题,您应该能够告诉分析器忽略它(通过依赖于您正在使用的分析工具的属性)。

于 2009-01-26T17:35:14.000 回答
21

鉴于当前 C# 3.0 允许自动属性,其语法如下:

public int Property {get; set;}

在公共字段上使用属性所需的额外工作几乎为零。问题是你永远不能完全确定一个字段不会被不同地使用,或者访问器永远不会改变,并且考虑到工作中的权衡,没有理由不实现一个属性。

无论如何,分析器抱怨的事情在很大一部分(在这种情况下,如 99.99% 的情况下)是糟糕的编程实践......但无论如何它只是在抱怨。字段可以公开,并且在某些极端情况下直接使用它是合理的。与以往一样,使用您的常识......但请记住最佳编程实践的基本规则......是否真的有很好的理由来打破约定?如果有然后继续,如果没有,或者如果答案是“它涉及更多工作”,那么坚持练习......

于 2009-01-26T17:45:30.453 回答
9

因为稍后更改公共字段以具有 get/set 访问器会破坏代码。有关更多信息,请参阅此答案

于 2009-01-26T17:35:19.977 回答
4

通常,将字段隐藏在属性后面是个好主意,即使您“确定”不会重新定义字段。很多时候,你今天“确定”的事情明天就会改变。而且,让一个属性引用一个字段只是有点麻烦。

也就是说,静态分析器不能替代思想。如果您对自己的设计感到满意并且您判断分析器是错误的,那么在这种情况下忽略或(如果可能)抑制该警告。

于 2009-01-26T17:35:34.873 回答
1

我认为关键在于,通常您不确定您以后不会重新定义该字段或添加该字段。封装和隐藏数据的全部意义在于您可以自由地做这些事情,而无需更改公共接口并随后破坏依赖类。如果您的属性访问器只是简单的 get/sets,那么无论如何它们都会被编译成这样,所以没有性能问题 - 鉴于此,您的问题应该是是否有充分的理由不使用它们?

于 2009-01-26T17:36:14.280 回答
1

另一个带来好处的属性是在进行反射时。当您反思您的课程时,您可以一次获得所有属性,而不必获取属性和字段。

于 2009-01-26T17:50:01.490 回答
0

And let's not forget that accessors give you flexibility when working with multiple threads.

于 2009-01-26T17:51:31.627 回答