6

プロパティでは第.NET一級市民であると想定されていますが、ILコードではプロパティのゲッターとセッターはget_PropertyNameset_PropertyNameとして実装されています。

class Property
{
    int Value { get { return 42; } }
    int get_Value() { return 6 * 9; }
    void set_Value(int i) { } // Error even though Value is a read only property
}

出力:

エラーCS0082:タイプ「SO.Property」は、同じパラメータータイプを持つ「get_Value」というメンバーをすでに予約しています

エラーCS0082:タイプ「SO.Property」は、同じパラメータータイプを持つ「set_Value」というメンバーをすでに予約しています

設計者が.NETユーザーコードと衝突する可能性のある名前を使用することにしたのはなぜですか?不正な文字を使用した可能性があります(Javaが$内部クラスのものに使用するため)。

4

4 に答える 4

8

J#(その設計上の決定に非常によく影響している可能性があります)など、プロパティの概念を持たない言語の場合でも、それらを呼び出すための単純な名前を付ける必要があります。

于 2009-05-20T10:49:20.570 に答える
8

Common Language Specification (CLS)では、プロパティを実装するときに、IL(特殊ビットで装飾)でget_メソッドとset_メソッドを使用する必要があります。これは、さまざまなコンパイラ(C#、マネージC ++、VB.NET、J#、IronPythonなど)が相互運用可能なバイトコードを作成するために必要です。

したがって、アンダースコア広い意味での「合法的な」文字ではありません。これらはCLSに準拠していないため、非プライベートインターフェイスでは使用しないでください。

また、 MSDNでCLS準拠のコードを作成する方法については、この記事を参照してください。

于 2009-05-20T10:52:11.313 に答える
2

外部コードから呼び出す必要があるかもしれないからです。

于 2009-05-20T10:48:58.060 に答える
1

良い質問-コンパイラによって生成されたメンバー(匿名の型とメソッド)のほとんどは、クラス内のどのメンバーとも衝突しないことが保証されている名前を使用しています。この特定のインスタンス(およびイベントメソッドの生成された名前)は、Microsoftが少し間違えた場合だと思います。

私が考えることができる唯一の理由は、Microsoftが、それ自体が「プロパティ」の概念または構文を持たないこれらのメソッドを他の言語が呼び出すことを許可することを望んでいた可能性があるということです。

于 2009-05-20T10:48:42.147 に答える