18

新しい演算子がC#やJavaなどの現代言語に存在するのはなぜですか?それは純粋に自己文書化コード機能ですか、それとも実際の目的に役立ちますか?

たとえば、次の例:

Class1 obj = new Class1();

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

よりPython風の書き方と同じくらい読みやすいです:

Class1 obj = Class1();

Class1 foo()
{
    return Class1();
}

編集:コーワンは質問の明確化で頭に釘を打ちました:なぜ彼らはこの構文を選んだのですか?

4

9 に答える 9

24
  1. これは自己文書化機能です。
  2. これは、他のクラスでメソッドに「Class1」という名前を付けることを可能にする方法です。
于 2009-01-11T20:23:20.960 に答える
9
Class1 obj = Class1();

C#およびJavaでは、「new」キーワードが必要です。これがないと、「Class1()」が「Class1」という名前のメソッドの呼び出しとして扱われるためです。

于 2009-01-11T20:24:33.967 に答える
9

有用性はドキュメントです。オブジェクトの作成とメソッドの呼び出しを区別するのは、Python よりも簡単です。

その理由は歴史的なものであり、C++ 構文に直接由来しています。C++ では、「Class1()」はスタック上にClass1 インスタンスを作成する式です。例: vector a = vector(); この場合、ベクトルが作成され、ベクトル a にコピーされます (場合によっては、オプティマイザが冗長なコピーを削除できます)。

代わりに、"new Class1()" は、Java や C# のようにヒープ上にClass1 インスタンスを作成し、Java や C++ とは異なり、異なるアクセス構文でそのポインターを返します。実際には、取得したオブジェクトを参照によって返すことができるように、何らかのヒープを参照する必要がある特殊な目的のアロケーターを使用するように new の意味を再定義できます。

さらに、Java/C#/C++ では、Class1() 自体が任意のメソッド/関数を参照する可能性があり、混乱を招く可能性があります。Javaコーディング規約では、クラス名は大文字で始まり、メソッド名は小文字で始まる必要があるため、実際にはそれを回避します.おそらくそれが、この場合のPythonの混乱を避ける方法です. リーダーは、"Class1()" がオブジェクトを作成し、"class1()" が関数呼び出しであり、"x.class1()" がメソッド呼び出しであると想定します ("x" は "self" の場合もあります)。

最後に、Python ではクラスをオブジェクト、特に呼び出し可能なオブジェクトにすることを選択したため、'new' のない構文は許可され、別の構文も許可することは矛盾します。

于 2009-01-11T21:04:44.853 に答える
5

C# の new 演算子は、呼び出された IL 命令に直接マップされます。この命令はnewobj、新しいオブジェクトの変数に実際にスペースを割り当ててから、コンストラクター (IL では .ctor と呼ばれます) を実行します。コンストラクターを実行すると (C++ と同じように)、初期化されたオブジェクトへの参照が非表示の最初のパラメーター ( thiscallなど) として渡されます。

thiscall のような規則により、ランタイムは、特定のクラスのメモリ内のすべてのコードを 1 回だけロードして JIT し、それをクラスのすべてのインスタンスで再利用できます。

Java は中間言語に同様のオペコードを持っているかもしれませんが、私は言うほど詳しくはありません。

于 2009-01-11T20:41:39.253 に答える
2

Javaがそれを選んだ理由は、構文がC++開発者によく知られているからです。C#がそれを選んだ理由は、Java開発者に馴染みがあるからです。

演算子がC++で使用される理由はnew、手動のメモリ管理では、メモリが割り当てられるタイミングを明確にすることが非常に重要であるためと考えられます。pythonesque構文は機能しますが、メモリが割り当てられていることはあまり明白ではありません。

于 2009-01-13T22:22:05.417 に答える
1

new演算子は、オブジェクトにメモリを割り当てます。これが目的です。あなたが言うように、それはあなたが使っているインスタンス(すなわち新しいインスタンス)も自己文書化します

于 2009-01-11T20:22:53.473 に答える