Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';tc#提供类似于C+的常数+;? > C中引用与C++相似,除了垃圾收集。p>_C#_Compiler Construction_Reference_Constants - Fatal编程技术网

为什么';tc#提供类似于C+的常数+;? > C中引用与C++相似,除了垃圾收集。p>

为什么';tc#提供类似于C+的常数+;? > C中引用与C++相似,除了垃圾收集。p>,c#,compiler-construction,reference,constants,C#,Compiler Construction,Reference,Constants,为什么C#编译器很难支持以下内容: 成员函数标记为const 对标记为const的数据类型(字符串除外)的引用,通过这些数据类型只能调用const成员函数 我相信如果C#支持这一点,它将非常有用。首先,它确实有助于C#程序员返回对私有数据的赤裸裸引用(至少我在工作场所看到过这样的情况),这似乎是一种普遍存在的同性恋倾向 或者在C#中已经有我缺少的东西了?(我知道readonly和const关键字,但它们并不能真正达到上述目的)问题是,我们需要C#中的constness吗 我很确定抖动知道给定的方

为什么C#编译器很难支持以下内容:

  • 成员函数标记为
    const
  • 对标记为
    const
    的数据类型(字符串除外)的引用,通过这些数据类型只能调用
    const
    成员函数
  • 我相信如果C#支持这一点,它将非常有用。首先,它确实有助于C#程序员返回对私有数据的赤裸裸引用(至少我在工作场所看到过这样的情况),这似乎是一种普遍存在的同性恋倾向


    或者在C#中已经有我缺少的东西了?(我知道
    readonly
    const
    关键字,但它们并不能真正达到上述目的)

    问题是,我们需要C#中的constness吗

  • 我很确定抖动知道给定的方法不会影响对象本身,并自动执行相应的优化。(可能通过发出
    call
    而不是
    callvirt
    ?)

  • 我不确定我们是否需要这些,因为康斯特内斯的大多数优点都与性能有关,所以你最终会得到第1点


  • 除此之外,C#还有
    readonly
    关键字。

    我怀疑有一些实际原因,也有一些理论原因:

    • 常量应该应用于对象还是引用?如果它在引用中,那么这应该只是编译时,还是作为引用本身的一部分?其他对同一对象具有非常量引用的对象可以在引擎盖下摆弄它吗
    • <>你想在C++中把它丢掉吗?这听起来不太像你在托管平台上想要的东西。。。但是在C++中有什么意义呢?
    • 当一个声明中涉及多个类型时,语法会变得很复杂(IMO),比如数组、泛型等。很难精确地确定哪一位是常量
    • 如果你不能抛弃它,每个人都必须正确对待它。换句话说,无论是.NET framework类型还是您使用的任何其他第三方库都必须做正确的事情,否则您将面临糟糕的情况,因为constness存在一个微妙的问题,您的代码无法做正确的事情
    不过,就目前无法支持它的原因而言,存在一个很大的问题:

    • 向后兼容性:不可能所有库都正确迁移到它,这使得它几乎毫无用处:(
    我同意有某种常数指示器是有用的,但恐怕我看不到它的发生

    编辑:在java社区里有一段关于这个激怒的争论很久了。有很多评论可能会引起你的兴趣。

    < P>因为乔恩已经涵盖了(当然)正确性并不像它看起来的那么简单。C++是单向的,D是另一种方式(可以说是更正确/有用)。正如你所发现的那样,C#与它调情,但没有做任何更大胆的事情(而且可能永远不会好,因为乔恩又被很好地掩盖了)

    也就是说,我相信Jon的许多“理论原因”在D的模型中得到了解决

    < d >(2),const工作得非常类似C++,除了它是完全可传递的(所以应用于指针的const将应用于指向的对象,该对象的任何成员,对象的任何指针,以及指向的对象等)-但是,这是明确的,这只适用于您已经声明const的变量。(因此,如果您已经有一个非常量对象,并且您将一个常量指针指向它,那么非常量变量仍然可以改变状态)

    D引入了另一个关键字-不变量-它适用于对象本身。这意味着一旦初始化,任何东西都不能改变状态

    这种安排的美妙之处在于,常量方法可以同时接受常量对象和不变对象。因为不变对象是函数世界的面包和黄油,常量方法可以在函数意义上标记为“纯”,即使它可以用于可变对象

    回到正轨上——我想我们现在(后半部分顽皮的人)才明白如何最好地使用常量(和不变量)……Net最初是在事情变得更加模糊时定义的,所以没有承诺太多——现在进行改造为时已晚

    我希望看到.Net虚拟机上运行d端口,不过:-)

    ,C语言的设计者已经回答了这个问题:


    如果不可变类型被添加到C#的未来版本中,我不会感到惊讶。 C#3.0已经朝着这个方向发展

    例如,匿名类型是不可变的


    我认为,由于设计了支持并行性的扩展,您可能会看到不变性越来越多地出现。

    我不同意您所说的“constness的大多数优点都与性能相关”我认为大部分是正确和可维护性。它不是为了抖动的方便,而是为了程序员。在C++中,如果我正在尝试修改一个const对象,编译器会给我一个错误。所以,例如,我可以从我的方法返回const引用。危险!谢谢Jon。这很有启发性。有趣的是,我还没有看到。不过,我认为从功能的角度来看(正如我在回答中提到的),任何困难都是值得的。