为什么C#和const参数中没有const成员方法?

use*_*949 16 .net c#

与C++不同,C#中没有任何const成员方法和const参数.是什么原因?

Eri*_*ert 27

首先,没有要求我们提供实现功能的原因.功能非常昂贵; 必须有一个理由实现一个功能,而不是一个理由实现一个功能.

其次,C#不是C++或C的克隆.仅仅因为某个功能在某种其他语言中并不是将其放入C#的理由.

第三,"const"在C和C++中被彻底打破."const"不保证你可以真正依赖.如果您是采用const引用的方法的调用者,那么您无法保证该方法遵循constness ; 该方法有许多方法可以改变const引用.如果您是const引用的使用者,那么您无法保证底层对象实际上不会随意变异.由于合同未在呼叫者或被呼叫方执行,因此它远远弱于我们希望在类型系统中进行的任何其他保证.我们不想复制这样一个破碎的系统.

第四,将constness放在CLR类型系统中意味着每种语言都必须使用相同的constness实现; 由于不同的语言对于常量具有不同的含义,这将使得将更多语言带入CLR 变得更加困难,而不是更容易.

没有做这个极其昂贵的功能有很多原因,而且很少有理由这样做.昂贵,不合理的功能无法实现.

  • 你是对的,`const`引用的使用者不能指望不会在其他地方修改指示对象.`const`(作为指针和引用的限定符)是关于共享对象的只读视图,而不是使对象不可变.但我不同意这是没用的.如果函数接受const引用(或指向const的指针),**最好不要尝试修改引用的对象,除非`mutable`修饰符允许,因为我可能已经传入一个真正的常量对象存储在只读存储器**. (18认同)
  • (续)C++`const_cast`(以及剥离`const`的等效机制)是禁止的,除非函数可以保证对象在定义点不是`const`,这有效地限制了它们对私有内部辅助函数的使用.对于C++中的公共API,尝试修改通过`const`引用(或指针)传入的对象违反了标准并调用*未定义的行为*. (14认同)
  • Const不会在C/C++中被破坏,也不会产生误导.它保证与任何其他类型信息完全一样多.C和C++的打字很弱.类型信息从不给予任何保证.它是捕捉错误的绝佳工具. (12认同)
  • 当涉及到特征论证时,你正在谈论"糟透了"的语义.如果某个功能被认为是有用的,那么质疑为什么它不被包含在内是完全有效的.更合适的总结是说该特征的实施成本超过其利益,而不是将该问题视为原则问题无效. (9认同)
  • @Ben:我没有说C++中的const是*无用的*.这非常有用.我用它所有的时间.我说这是*不可靠*,*误导*和*危险*.有许多东西是不可靠的,误导性和危险的,仍然有用.那不是手头的问题.手头的问题是"C#语言应该复制这种不可靠,误导性和危险的特征吗?" 答案是"不",因为实施可疑设计的好处并不能证明这样做的巨大成本. (7认同)
  • @Joan:数组最大的问题是它们是任意可变的,因此不能安全地缓存.但他们所有的其他属性都非常好*.它们几乎*精确地占据了必要的空间,而且开销非常小.它们的索引速度非常快.它们可以通过参考便宜地传递.等等. (2认同)
  • Const正确性是C++中的市长成功.这不是关于保证,而是关于合同和编译器帮助您编写正确的代码. (2认同)

Ben*_*igt 8

C#没有它,因为.NET没有..NET不是因为CLR开发团队认为不值得付出努力.

你可以在MS博客上阅读,比如Raymond Chen的"The Old New Thing"或者Eric Lippert的"编码中的神奇冒险",微软如何优先考虑功能.