Eri*_*ric 8 .net c# const const-correctness readonly
来自C++背景并尝试学习C#,我遇到的最令人沮丧的语言遗漏之一就是const关键字.
所以,我一直试图找到一种可以用来在C#中实现const正确性的模式.
这个答案有一个有趣的建议:为你的所有类型创建一个只读界面.但正如Matt Cruikshank在评论中指出的那样,如果你的班级有收藏品或其他丰富类型,这就成了问题.特别是如果您无法控制类型,并且无法使其实现只读接口.
是否存在可以处理丰富类型和集合的任何模式或解决方案,或者我们是否强制在C#中进行复制?在C#中完全放弃const正确性是否更好?
你能在C#中获得不变性吗?当然,如果你为它设计.您可以使用接口创建创造性的东西,等等,只显示get属性和任何可变方法.
也就是说,请记住,没有任何东西可以阻止狡猾的用户将其转换回实际类型(当然,C++也可以说,你可以抛弃常量).
ISomeReadOnlyInterface readOnly = new SomeFullObject();
// hah, take that read-only interface!
((SomeFullObject)readOnly).SomeMutatingMethod();
Run Code Online (Sandbox Code Playgroud)
与集合相同.即使你返回一个ReadOnlyCollection(它可以防止对集合本身的变异行为),集合中的数据仍然是可变的(只要类型允许它当然).
所以我担心这里真的没有简单的答案.没有"flip-a-switch"const可以为您提供C++的功能.
这取决于你,你可以:
后者就像集合一样Dictionary<TKey, TValue>.没有什么可以说你不能把密钥类型变成一个可变类型(但是如果你这样做会有祸害),并且MSDN非常清楚,如果你改变密钥的方式使它的哈希代码发生变化,它就在你自己的脖子上...
对于我自己的工作,我倾向于保持简单,除非实际上有一个很大的问题,我的课程可能会以一种会导致副作用的方式改变.例如,如果我将Web服务结果存储在缓存中,我将返回缓存项的副本,以便在用户修改结果时不会无意中修改缓存的值.
所以,很长一段时间,我不会担心你返回的每种类型的const-correctness ,这太过分了.我只担心你返回的东西,如果改变了,可能会给其他用户造成副作用.
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |