質問

ildasmとC#プログラムの使用例:

static void Main(string[] args)
{

}

与える:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       2 (0x2)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ret
} // end of method Program::Main

hidebysigコンストラクトは何をしますか?

役に立ちましたか?

解決

ECMA 335 から、パーティションのセクション8.10.4 1:

  

CTSは独立した制御を提供します   目に見える両方の名前の上   基本型(非表示)および   派生のレイアウトスロットの共有   クラス(オーバーライド)。非表示は   でメンバーをマークすることによって制御されます   名前で非表示にする派生クラス   または名前と署名で非表示にします。隠蔽   常に種類に基づいて実行されます   メンバー、つまり派生フィールド   名前はベースフィールド名を隠すことができますが、   メソッド名、プロパティ名、または   イベント名。派生メンバーが   名前で非表示、次に   基本クラスと同じ種類の   同じ名前は   派生クラス;メンバーがマークされている場合   名前と署名で非表示にしてから   まったく同じ種類のメンバー   同じ名前とタイプ(フィールド用)または   メソッドシグネチャ(メソッド用)は   派生クラスから隠されています。   区別の実装   これら2つの非表示の形式の間は   完全にソース言語で提供   コンパイラとリフレクションライブラリ。   VESに直接的な影響はありません   

(それからすぐにはわかりませんが、hidebysigは<!> quot; name-and-signature <!> quot;で隠すことを意味します。)

また、パーティション2のセクション15.4.2.2:

  

hidebysigは、   ツールであり、VESによって無視されます。それ   宣言されたメソッドが   基本クラスのすべてのメソッドを非表示にします   マッチング方法を持つタイプ   署名;省略した場合、メソッド   同じのすべてのメソッドを非表示にする必要があります   署名に関係なく、名前。

例として、次のものがあるとします:

public class Base
{
    public void Bar()
    {
    }
}

public class Derived : Base
{
    public void Bar(string x)
    {
    }
}

...

Derived d = new Derived();
d.Bar();

これは有効です。これは、C#コンパイラがBar(string)を使用しているため、Bar() 隠さないためです。 <!> quot;名前で隠す<!> quot;セマンティクスでは、Derived型の参照で<=>を呼び出すことはできませんが、Baseにキャストしてそのように呼び出すことはできます。

編集:上記のコードをDLLにコンパイルし、それをildasmingし、<=>と<=>の<=>を削除し、再度ilasmingしてから、他のコードから<=>を呼び出そうと試みました。 :

Derived d = new Derived();
d.Bar();

Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments

ただし:

Base d = new Derived();
d.Bar();

(コンパイルの問題はありません。)

他のヒント

The SKEETの回答によると、さらにこの理由は、JavaとC#により、クラスのクライアントが基本クラスからのメソッドを含む同じ名前のメソッドを呼び出すことができるためです。一方、C ++はそうではありません。派生クラスが基本クラスのメソッドと同じ名前のメソッドを1つでも定義している場合、クライアントは同じ引数をとらない場合でも基本クラスメソッドを直接呼び出すことはできません。したがって、この機能はCILに含まれており、オーバーロードに対する両方のアプローチをサポートしています。

C ++では、usingディレクティブを使用して、基底クラスからオーバーロードの名前付きセットを効果的にインポートできるため、<!> quot; overload set <!> quot;の一部になります。そのメソッド名に対して。

Microsoft Docs

  

派生クラスのメンバーがC#new修飾子で宣言されている場合   またはVisual Basic Shadows修飾子、同じのメンバーを非表示にすることができます   基本クラスの名前。 C#は、署名によって基本クラスメンバーを隠します。それ   基本クラスのメンバーに複数のオーバーロードがある場合、唯一のオーバーロードは   隠されているは、同一の署名を持つものです。対照的に、   Visual Basicは、すべての基本クラスのオーバーロードを隠します。したがって、 IsHideBySig   Visual Basic falseで宣言されたメンバーでtrueを返します   修飾子、およびC#<=>修飾子で宣言されたメンバーの<=>。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top