为什么C#和Java会对“新”运算符感到困扰?
为什么新操作符以现代语言存在,如C#和Java? 它纯粹是一种自我记录的代码功能,还是用于实际目的?
例如下面的例子:
Class1 obj = new Class1();
Class1 foo()
{
return new Class1();
}
就像Pythonesque的写作方式一样容易阅读:
Class1 obj = Class1();
Class1 foo()
{
return 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