为什么C#和Java会对“新”运算符感到困扰?

为什么新操作符以现代语言存在,如C#和Java? 它纯粹是一种自我记录的代码功能,还是用于实际目的?

例如下面的例子:

Class1 obj = new Class1();

Class1 foo()
{
    return new Class1();
}

就像Pythonesque的写作方式一样容易阅读:

Class1 obj = Class1();

Class1 foo()
{
    return Class1();
}

编辑:考恩澄清了这个问题,在头上敲了一下头:他们为什么选择这种语法?


  • 这是一个自我记录功能。
  • 这是一种可以在某些其他课程中命名“Class1”方法的方法

  • Class1 obj = Class1();
    

    在C#和Java中,您需要“新”关键字,因为没有它,它会将“Class1()”视为对名为“Class1”的方法的调用。


    文档的用处在于 - 比Python中的方法调用区分对象创建更容易。

    原因是历史性的,直接来自C ++语法。 在C ++中,“Class1()”是在堆栈上创建Class1实例的表达式。 例如:vector a = vector(); 在这种情况下,将创建一个矢量并将其复制到矢量a(在某些情况下,优化程序可以删除冗余副本)。

    相反,“新Class1()”在堆上创建Class1实例,就像在Java和C#中一样,并返回一个指向它的指针,具有不同于Java和C ++的访问语法。 实际上,new的含义可以重新定义为使用任何专用分配器,它仍然必须引用某种堆,以便可以通过引用返回获得的对象。

    而且,在Java / C#/ C ++中,Class1()本身可以引用任何方法/函数,并且会令人困惑。 Java编码惯例实际上可以避免这种情况,因为它们需要类名以大写字母和方法名开头,并且可能是Python避免混淆的方式。 读者期望“Class1()”创建对象,“class1()”为函数调用,“x.class1()”为方法调用(其中'x'可以为'self')。

    最后,由于在Python中他们选择将类作为对象,特别是可调用对象,所以不允许使用“新”的语法,并且允许具有另一种语法也是不一致的。

    链接地址: http://www.djcxy.com/p/13881.html

    上一篇: Why do C# and Java bother with the "new" operator?

    下一篇: Resources for learning C program design