6

refまたはパラメータを使用してメソッドを呼び出す場合はout、メソッドを呼び出すときに適切なキーワードを指定する必要があります。スタイルとコードの品質の観点からは理解していますが (たとえば、ここで説明されているように)、呼び出し元でキーワードを指定する技術的な必要性があるかどうかも知りたいです。

例えば:

static void Main()
{
    int y = 0;
    Increment(ref y); // Is there any technical reason to include ref here?
}

static void Increment(ref int x)
{
    x++;
}
4

4 に答える 4

12

私が考えることができる唯一の技術的な理由は、オーバーロードの解決です。

static void Increment(ref int x)

そしてまた

static void Increment(int x)

これは許可されています。呼び出しがなけれrefば、コンパイラはそれらを区別できません。

于 2013-04-19T02:47:35.747 に答える
11

呼び出しサイトでそれらが必要ないように言語が設計されている可能性があるかどうかを尋ねている場合、答えはイエスです。彼らが取り残されなかった特別な理由はありません。コンパイラはメタデータから必要なすべての情報を取得しているため、適切な変換を行うことができます。

そうは言っても、そうすると、次の 2 つのオーバーロードを持つことができなくなります。

public void DoSomething(int x);
public void DoSomething(ref int x);

コンパイラはそれを明確にすることができません。

refandoutはオプションにすることもできましたが、その場合、これらのオーバーロードは許可されます。また、コンパイラはデフォルト (つまり、非参照) を使用するか、あいまいなエラーを発行して、実際に必要なものを指定するように指示することができます。

とはいえ、私は呼び出しサイトで指定する必要があるのが好きです。パラメータが変更される可能性があることがわかります。値パラメーターが渡されるのと同じ方法でパラメーターが渡される Pascal で長年働いてきたので(呼び出しサイトの構文は同じです)、その点で C# の特異性を非常に好みます。refoutvar

于 2013-04-19T02:47:48.333 に答える
-1

コンパイラは、IL をビルドするときに、解釈するメソッド パラメーターを認識する必要があります。1 つの理由は、次のようなオーバーロードがあることです。

public void (ref int x) {}
public void (int x)     {}

もう 1 つの理由はout、メソッドの外部で解釈された値を使用する値渡しパラメーターの使用を明示的に許可することです。refパラメータへのポインタを提供し、それによってメソッドからの新しい値を同じメモリ位置にポイントします

于 2013-04-19T03:35:43.110 に答える