当前位置:  开发笔记 > 编程语言 > 正文

为什么C#和Java会烦扰"新"运算符?

如何解决《为什么C#和Java会烦扰"新"运算符?》经验,为你挑选了4个好方法。

为什么新的运算符存在于C#和Java等现代语言中?它纯粹是一个自我记录的代码功能,还是它可以用于任何实际目的?

例如以下示例:

Class1 obj = new Class1();

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

像Pythonesque写的那样容易阅读:

Class1 obj = Class1();

Class1 foo()
{
    return Class1();
}

编辑:考恩澄清问题:考恩为什么选择这种语法?



1> Paco..:

    这是一个自我记录功能.

    这是一种可以在其他类中命名方法"Class1"的方法


另一方面,如果没有new运算符,则可以在其他地方创建new()函数.;)我认为答案很简单"Java/C#的程序员看起来更熟悉.
2.这可能是肯定的,但为什么你想要反对良好的命名惯例呢?你知道,类应该是名词和方法动词......

2> Michael..:
Class1 obj = Class1();

在C#和Java中,您需要"new"关键字,因为没有它,它会将"Class1()"视为对名称为"Class1"的方法的调用.


这完全不是要求它.问题是"他们为什么选择这种语法?".它更像是"为什么他们会选择_内燃机来移动汽车?",这是一个非常明智的问题并且有完全明智的答案.

3> Blaisorblade..:

有用的是文档 - 从方法调用中区分对象创建比在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"的语法,并且允许具有另一种语法也是不一致的.


不只是那个; Python中的函数和构造函数之间没有语义差异,至少不是来自类外部.正如你所做的那样`def inc(a):返回+ 1; map(inc,somelist)`用于递增`somelist`中的所有项目,你可以做`map(int,somelist)`来将`somelist`中的所有项转换为`int`s.

4> joshperry..:

C#中的new运算符直接映射到IL指令,该指令newobj实际上为新对象的变量分配空间,然后执行构造函数(在IL中称为.ctor).在执行构造函数时 - 与C++非常相似 - 对初始化对象的引用作为不可见的第一个参数(如thiscall)传入.

类似于此调用的约定允许运行时仅为特定类加载和JIT内存中的所有代码一次,并将其重用于该类的每个实例.

Java可能在它的中间语言中有类似的操作码,以为我不太熟悉.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有