为什么新的运算符存在于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中,您需要"new"关键字,因为没有它,它会将"Class1()"视为对名称为"Class1"的方法的调用.
有用的是文档 - 从方法调用中区分对象创建比在Python中更容易.
原因是历史性的,直接来自C++语法.在C++中,"Class1()"是在堆栈上创建Class1实例的表达式.例如:vector a = vector(); 在这种情况下,创建一个向量并将其复制到向量a(在某些情况下,优化器可以删除冗余副本).
相反,"new Class1()" 在堆上创建一个Class1实例,就像在Java和C#中一样,并返回一个指向它的指针,使用不同的访问语法,与Java和C++不同.实际上,new的含义可以重新定义为使用任何特殊用途的分配器,它仍然必须引用某种堆,以便可以通过引用返回获得的对象.
而且,在Java/C#/ C++中,Class1()本身可以引用任何方法/函数,这会令人困惑.Java编码约定实际上会避免这种情况,因为它们要求类名以大写字母开头,方法名称以小写字母开头,这可能就是Python在这种情况下避免混淆的方式.读者期望"Class1()"创建一个对象,"class1()"是一个函数调用,"x.class1()"是一个方法调用(其中'x'可以是'self').
最后,因为在Python中他们选择使类成为对象,特别是可调用对象,所以允许没有"new"的语法,并且允许具有另一种语法也是不一致的.
C#中的new运算符直接映射到IL指令,该指令newobj
实际上为新对象的变量分配空间,然后执行构造函数(在IL中称为.ctor).在执行构造函数时 - 与C++非常相似 - 对初始化对象的引用作为不可见的第一个参数(如thiscall)传入.
类似于此调用的约定允许运行时仅为特定类加载和JIT内存中的所有代码一次,并将其重用于该类的每个实例.
Java可能在它的中间语言中有类似的操作码,以为我不太熟悉.