当前位置:  开发笔记 > 编程语言 > 正文

有没有琐碎的财产保存你的培根?

如何解决《有没有琐碎的财产保存你的培根?》经验,为你挑选了5个好方法。

那里有很多建议你不应该公开地公开你的字段,而是使用普通的属性.我一遍又一遍地看到它.

我理解这些论点,但在大多数情况下我认为这不是一个好建议.

有没有人有一个真正重要的时间的例子?在写一个琐碎的财产时,将来可能会有一些重要的事情(或者当没有使用它时会让他们陷入真正的麻烦)?

编辑:DataBinding参数是正确的,但不是很有趣.DataBinding代码中的一个错误是它不接受公共字段.因此,我们必须编写属性来解决该bug,而不是因为属性是明智的类设计选择.

编辑:要清楚,我正在寻找现实世界的例子,而不是理论.真正重要的时刻.

编辑:在setter上设置断点的能力似乎很有价值.为调试器设计我的代码是不幸的:我宁愿调试器变得更聪明,但考虑到我们的调试器,我将采用这种能力.好东西.



1> Robert Pauls..:

在不确定的未来可能很难使代码工作,但这不是懒惰的借口.在字段上编码属性是惯例,它是务实的.称之为防御性编程.

其他人也会抱怨速度问题,但是JIT'er足够聪明,能够像暴露公共场地一样快.足够快,我永远不会注意到.

想到一些非平凡的事情

    公共字段完全公开,您不能强制使用只读或只写语义

    属性可以有有不同的getset可访问性(如公共获取,内部设置)

    您不能覆盖字段,但可以拥有虚拟属性.

    你的班级无法控制公共领域

    你的班级可以控制财产.它可以将设置限制为允许的值范围,标记状态已更改,甚至延迟加载值.

    反思语义不同.公共领域不是财产.

    没有数据绑定,正如其他人指出的那样.(这只是你的一个错误. - 我能理解为什么.net框架设计师不支持他们不赞成的模式.)

    您不能在接口上放置字段,但可以在接口上放置属性.

    您的房产甚至不需要存储数据.您可以创建外观并分派到包含的对象.

您只需输入额外的13个字符即可.这似乎不像是投机性的普遍性.存在语义差异,如果没有别的,属性具有不同的语义含义,并且比公共字段更灵活.

 public string Name { get; set; }
 public string name;

我记得有一次第一次使用.net时,我将几个类编码为只是字段,然后由于某种原因我需要将它们作为属性,而且当我第一次完成它时,完全浪费时间时间.

那么你有什么理由遵守惯例呢?为什么你觉得需要游泳上游?没有这样做,它为你节省了什么?


@Eamon请停止.我提供了"公共领域与公共财产"的答案.我已经说过为什么我认为这是一个务实的选择,有9个非平凡的原因.无论如何,不​​同意.创建自己的答案,了解为什么公共属性是一个优秀的解决方案,以及他们如何保存你的培根.将其链接到评论并删除此无用的交换.如果人们觉得你有一个好的答案,他们就会对它进行投票,并且会更容易理解.
喜欢这句话:"那你有什么理由不参加会议?为什么你觉得需要游泳上游?没有这样做会给你带来什么?" 我一直在问一个同事完全一样,因为他坚持将C#格式化为1972年的大型机ANSI C.

2> JaredPar..:

我有一个简单的属性,在调试时保存了几次..Net不支持数据断点(读或写)的概念.有时,在调试非常复杂的场景时,跟踪对特定属性的读/写非常重要.这对于一个属性很容易,但是对于一个领域来说是不可

如果您不在生产环境中工作,则可以很容易地重构字段 - >属性以进行调试.偶尔会遇到只能在生产环境中重现的错误,这些错误很难使用新的二进制文件进行修补.物业可以救你.

但这是一个相当有限的情况.


我刚刚发布了类似的观点.下次我会帮你的,小工具.

3> Joel Coehoor..:

杰伊,我曾经想过同样的事情.为什么要使用一个属性,只有那里提供直接访问私人会员?如果你可以把它描述为一个自动装置,那么拥有一个属性而不是一个领域似乎有点愚蠢.即使您需要更改实现,您也可以随后重构为不动产,任何相关代码仍可正常工作,对吧?好吧,也许不是.

你看,我最近看到了关于琐碎属性的亮点,所以也许现在我可以帮你做同样的事情.

最终让我信服的是相当明显的一点(回想起来).Net中的属性只是getter和setter方法的语法糖,而这些方法与属性本身有不同的名称.同一个程序集中的代码仍然有效,因为无论如何都必须同时重新编译它.但是,如果您将字段重构为属性,则链接到您的不同程序集中的任何代码都将失败,除非它同时针对您的新版本重新编译.如果它是一个从一开始的财产,一切都还是不错的.



4> Jason Buntin..:

部分原因是这些属性在将来可能不会是微不足道的 - 如果将外部代码绑定到某个字段然后想要将其包装在属性中,则所有相关代码都必须更改,并且您可能无法要做到这一点,特别是在你是一名控制设计师或有你无法控制的图书馆等的情况下.

更不用说某些.NET实践不允许您特别使用字段 - 数据绑定.

我相信还有其他好的理由.为什么这对你很重要?使用自动属性并完成它.似乎不值得关注的事情......



5> Jon Skeet..:

我会用另一个问题回答你的问题:你是否真的受益于不让所有类型和成员公开?我怀疑我没有通过这样做直接防止任何错误.但是,我已经正确地封装了我的类型,只暴露了暴露的内容.属性是相似的 - 好的设计比什么都重要.我认为属性在概念上与字段不同; 它们是合同的一部分,而不是从根本上实施的一部分.将它们视为属性而不是字段有助于我更清楚地思考我的设计,从而产生更好的代码.

哦,我偶尔从不破坏源兼容性,能够设置断点,日志访问等方面受益.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有