web-dev-qa-db-ja.com

メソッドシグネチャの定義?

メソッドシグネチャ(またはメソッドのシグネチャ)の正しい定義は何ですか?

グーグルで、私は様々な定義を見つけます:

メソッド名とパラメーターリストの組み合わせです

それは〜を意味しますか method signature = method name + argument list?次に、「メソッド」と「メソッド署名」の違いがわかりません。

メソッドがある場合:

public void Foo(int x, int y) { ... }

メソッドのシグネチャは次のいずれかですか、どちらでもありませんか?

  • フー
  • Foo(int、int)
  • Foo(int x、int y)
  • フー(34、78)

メソッドのメソッドシグネチャは何ですかと誰かが私に尋ねた場合、どのように答えますか?

23
KMC

メソッドのシグネチャをメソッド名、ジェネリックアリティ、仮パラメータアリティ、仮パラメータのタイプと種類として定義する正しい答えがいくつかありますが、not戻り値の型または「params」修飾子です。

それは正しいですが、ここには微妙な点があります。 C#言語がメソッドシグネチャを定義する方法は、[〜#〜] clr [〜#〜]がメソッドシグネチャを定義する方法とは異なります。 C#と他の言語間の相互運用時の問題。

CLRの場合、メソッドシグネチャは、メソッド名、ジェネリックアリティ、仮パラメーターアリティ、仮パラメーターの型と種類、および戻り値の型で構成されます。したがって、最初の違いがあります。 CLRは戻り値の型を考慮します。

CLRは、 "out"と "ref"が異なる仮パラメーターの種類であるとは見なしません。 C#はそうします。

CLRには、「オプションおよび必須の型修飾子」と呼ばれる興味深い機能があり、通常は「modopts」および「modreqs」と呼ばれます。 another typeを使用して、メソッドシグネチャの型に「メイン」型について通知することは可能です。たとえば、C++では、これらは2つの異なるシグネチャです。

void M(C const & x);
void M(C & x);

両方のシグネチャは、タイプ "reference to C"のパラメータを取るメソッドMを定義します。ただし、1つ目はconst参照で、2つ目はそうではないため、C++言語はこれらを異なるシグネチャと見なします。 CLRは、C++/CILコンパイラーが仮パラメーター型の特別な「this is const」型のmodoptを発行できるようにすることで、これを実装します。

C#でmodを読み取ったり設定したりする方法はありませんが、C#コンパイラはそれを認識し、それらを尊重しますある意味で。たとえば、C++/CILで次のように宣言されたパブリック仮想メソッドがあるとします。

void V(C const * x)

c#で記述された派生クラスでそれをオーバーライドすると、C#コンパイラはnotによってconstの正確性を強制します。 C#コンパイラには、const modoptの意味がわかりません。しかし、C#コンパイラは、オーバーライドするメソッドがmodoptを配置してメタデータに出力されるようにします。 CLRでは、オーバーライドするメソッドとオーバーライドされるメソッドのシグネチャが一致する必要があるため、これが必要です。コンパイラーは、C#ルールではなく、シグニチャー・マッチングのCLRルールに従う必要があります。

28
Eric Lippert

MSDNから:

メソッドのシグネチャは、メソッドの名前と、各仮パラメーターのタイプと種類(値、参照、または出力)で構成され、左から右の順に検討されます。メソッドのシグネチャには、特に戻り値の型が含まれていません。また、右端のパラメーターに指定できるparams修飾子も含まれていません。

ここで重要なのは、メソッドの戻り値の型がそのシグネチャに属していないことです。したがって、戻り値の型だけが異なるメソッドをオーバーロードすることはできません。

13
Robert Hegner

メソッドシグネチャは、コンパイラがメソッドを識別するために使用できるメソッドの属性のセットです。

属性は次のとおりです。メソッド名、パラメーターの数、パラメーターのタイプ、およびパラメーターの順序。

異なるメソッドシグネチャの例:

Foo()
Foo(int)
Foo(String)
Foo(int, string)
Foo(string, int)

これらのメソッドはすべて異なるため、コードで呼び出すと、コンパイラーはメソッドシグネチャを使用して実行するメソッドを推測できます。

モジュール式プログラミングのメソッドのスコープを忘れないでください...

9
jlvaquero

メソッドシグネチャには、次の項目が含まれます。

  • メソッドの名前。
  • パラメータの数。
  • パラメータのデータ型と順序。

注:戻り値の型は署名の一部ではありません。

5
Prateek

上記の例では、メソッドシグネチャはFoo(int x、int y)です。メソッドのオーバーロードを許可する言語(C#やJavaなど)ではメソッド名は同じになりますが、シグネチャは異なる必要があるため、これは重要です。

1
BMB

C#言語仕様(v 4.0)のセクション3.6は、メソッドシグネチャに関する最も正確な回答を提供します。

メソッドのシグネチャは、メソッドの名前、型パラメーターの数、および各仮パラメーターの型と種類(値、参照、または出力)で構成され、左から右の順に検討されます。これらの目的のために、仮パラメーターの型で発生するメソッドの型パラメーターは、名前ではなく、メソッドの型引数リストでの順序位置によって識別されます。メソッドのシグネチャには、戻り値の型、右端のパラメーターに指定できるparams修飾子、オプションの型パラメーターの制約は特に含まれていません。

0
Mike Cowan