C#中的引用与C++中的引用非常相似,只是它们是垃圾回收的.
为什么C#编译器支持以下内容如此困难:
会员职能标记const
.
引用标记的数据类型(字符串除外)const
,通过它只能const
调用成员函数?
我相信如果C#支持这个会非常有用.首先,它真的有助于看似广泛的同性恋放弃C#程序员返回裸体引用私人数据(至少这是我在我的工作场所看到的).
或者在C#中我已经缺少了相同的东西?(我知道关键字readonly
和const
关键字,但它们并没有真正满足上述目的)
我怀疑有一些实际原因,以及一些理论上的原因:
常量应该适用于对象还是引用?如果它在引用中,那么这应该只是编译时,还是引用本身内的一点?对于同一个对象有非const引用的其他东西可以在引擎盖下摆弄吗?
您是否希望能够在C++中将其丢弃?这听起来不像你在托管平台上想要的东西......但是那些在C++中有意义的时候呢?
当声明中涉及多个类型时,语法会变得棘手(IMO) - 想想数组,泛型等等.很难确定哪个位是const.
如果你不能把它扔掉,每个人都必须把它弄好.换句话说,.NET框架类型和您使用的任何其他第三方库都必须做正确的事情,否则您将面临令人讨厌的情况,即您的代码无法做正确的事情,因为有一个微妙的问题常量性.
虽然现在无法支持它,但它有一个很大的问题:
向后兼容性:没有办法将所有库正确迁移到它,使它几乎无用:(
我同意有一些常量指标是有用的,但我不能看到它发生,我害怕.
编辑:关于Java社区中的这种肆虐已有多年的争论.对相关的bug有很多评论,你可能会觉得有趣.
正如乔恩已经涵盖的那样(当然)const正确性并不像看起来那么简单.C++以一种方式做到了.D做另一种(可以说是更正确/有用)的方式.C#与它调情,但没有做任何更大胆的事情,正如你已经发现的那样(并且可能永远不会好,因为Jon再次覆盖了).
也就是说,我相信Jon的许多"理论原因"在D模型中得到了解决.
在D(2.0)中,const的工作方式与C++非常相似,只是它是完全传递的(因此应用于指针的const将应用于指向的对象,该对象的任何成员,对象具有的任何指针,指向的对象等) ) - 但显而易见的是,这仅适用于您声明为const的变量(因此,如果您已经有一个非const对象并且您使用了一个const指针,那么非const变量仍然可以改变状态).
D引入了另一个关键字 - 不变量 - 它适用于对象本身.这意味着一旦初始化就没有任何东西可以改变状态.
这种安排的好处是const方法可以接受const和不变对象.由于不变对象是功能世界的面包和黄油,而const方法在功能意义上可以被标记为"纯粹" - 即使它可以与可变对象一起使用.
回到正轨 - 我认为我们现在只是(后半部分的顽皮分子)了解如何最好地使用const(和不变量)..Net最初是在事情变得更加朦胧的时候定义的,所以并没有过多地承诺 - 现在改造已经太晚了.
我很想在.Net VM上看到D的端口,但是:-)
C#语言的设计师Mr. Heljsberg已回答了这个问题:
http://www.artima.com/intv/choicesP.html