为什么任何人都不会接受C#中的公共字段?
似乎每个C#静态分析器都想在发现公共领域时抱怨。 但为什么? 当然,有些情况下公共(或内部) 域是足够的,并且使用get_
和set_
方法拥有一个属性是没有意义的。 如果我确实知道我不会重新定义该领域或添加它(副作用是不好的,对吧?) – 不应该是一个简单的领域足够吗?
这实际上是关于未来的validation你的代码。 当你说(强调我的):
如果我确实知道我不会重新定义该领域或添加它(副作用是不好的,对吧?) – 不应该是一个简单的领域足够吗?
这是一个绝对的声明,正如我们所知道的(以及大多数静态分析器),生命中只有两个绝对的东西。
这只是为了保护你免受这一点。 如果这是一个问题,您应该能够告诉分析仪忽略它(通过依赖于您正在使用的分析工具的属性)。
因为它打破封装 – 这就是为什么大多数人大量使用访问器。 但是,如果您认为这是您的任务的正确解决scheme,请忽略它(意味着严格的封装投诉),并为您的项目做正确的事情。 不要让OO纳粹告诉你。
鉴于目前的C#3.0允许自动属性的语法如下:
public int Property {get; set;}
在公共领域使用属性所需的额外工作几乎为零。 事情是,你永远不能完全确定一个领域将不会被不同的使用,或访问者将永远不会改变,给工作的权衡,没有理由不执行财产。
无论如何,分析器抱怨的事情很高(在这种情况下,99.99%的情况下)是糟糕的编程实践…但无论如何,这只是抱怨。 田地可以被公开,并且有一些极端的情况可能是直接使用的。 一如既往, 用你的常识 ……但要记住最好的编程实践的基本原则…… 是否有一个很好的理由来打破惯例? 如果有,那么继续,如果没有,或者如果答案是“涉及更多的工作”,那么坚持练习…
因为稍后更改公共字段以获取/设置访问器将会破坏代码。 请参阅此答案以获取更多信息
一般来说,即使您“确定地知道”您不会重新定义该字段,隐藏字段背后的字段也是一个好主意。 很多时候,你明确知道今天的变化。 而且,把一个财产用于某个领域只是有点麻烦。
这就是说,静态分析仪不能代替思想。 如果你对你的devise感到满意,并且你认为分析仪是错误的,那么在这种情况下忽略或(如果可能的话)压制这个警告。
我认为重要的一点是,你一般不知道你将不会重新定义这个领域,或者以后再添加它。 封装和隐藏数据的重点是,你可以自由地做这些事情,而不必改变公共接口,从而打破依赖类。 如果你的属性访问器只是简单的获取/设置,那么他们将被编译到那里,所以没有性能问题 – 因为你的问题应该是有没有好的理由不使用它们?
另一个利益属性带来的是反思。 当你反思你的课堂时,你可以一次性得到所有的属性,而不必得到属性和领域。
我们不要忘记,在使用multithreading的时候,访问器给了你灵活性。