dal*_*lle 17 language-design new-operator
为什么新的运算符存在于C#和Java等现代语言中?它纯粹是一个自我记录的代码功能,还是它可以用于任何实际目的?
例如以下示例:
Class1 obj = new Class1();
Class1 foo()
{
return new Class1();
}
Run Code Online (Sandbox Code Playgroud)
像Pythonesque写的那样容易阅读:
Class1 obj = Class1();
Class1 foo()
{
return Class1();
}
Run Code Online (Sandbox Code Playgroud)
Pac*_*aco 24
Class1 obj = Class1();
Run Code Online (Sandbox Code Playgroud)
在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"的语法,并且允许具有另一种语法也是不一致的.
归档时间: |
|
查看次数: |
4044 次 |
最近记录: |