繁体   English   中英

为什么没有人接受C#中的公共字段?

[英]Why won't anyone accept public fields in C#?

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

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

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

如果我确定我不会重新定义该字段或添加它(副作用是坏的,对吧?) - 不应该是一个简单的字段就足够了怎么办?

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

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

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

public int Property {get; set;}

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

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

因为稍后更改公共字段以获取/设置访问器将破坏代码。 有关更多信息,请参阅此答案

一般来说,隐藏属性后面的字段是个好主意,即使你“确切地知道”你不会重新定义字段。 经常,你今天“确切知道”的东西明天会发生变化。 并且,使一个属性来引用一个字段只是一点点麻烦。

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

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

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

让我们不要忘记,在使用多个线程时,访问器可以为您提供灵活性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM