ref
ref:MSDNは、次のように定義されています。「refキーワードは、参照によって渡される値を示します。」は、参照によってパラメーターを渡すことです。refはReferenceの略語でもあります。
refを使用しないでください
using System;
namespace Test_Code
{
class A
{
public void Method( int a)
{
a += 1;
}
public static void Main()
{
int c = 10;
A B = new A();
B.Method(c);
Console.WriteLine(c);
}
}
}
//输出10
refキーワードを使用する
using System;
namespace Test_Code
{
class A
{
public void Method(ref int a)
{
a += 1;
}
public static void Main()
{
int c = 10;
A B = new A();
B.Method(ref c);
Console.WriteLine(c);
}
}
}
//输出11
总结
refキーワードを使用しない場合、関数が受け取る値は10であり、メソッド(int a)メソッドでは、ローカル変数aが累積された後、メソッドの実行後に破棄されます。cの値はまだ10です。
refキーワードを使用して、cの値を受け取った関数Method(ref int a)は、実行された関数のアドレスa + = 66です。この場合はc + = 66に対応します。アドレス値cを直接変更します。
したがって、値型パラメーターを渡す方法、つまり同じキーの変数直接操作を参照してください。
でる
outの定義:パラメーター修飾子として、値ではなく参照によってメソッドに引数を渡すことができます。パラメーター修飾子としての「out」を使用すると、値ではなく参照によってメソッドにパラメーターを渡すことができます。
インターフェースとデリゲートのジェネリック型パラメーター宣言では、型パラメーターが共変であることを指定します。/インターフェースとデリゲートのジェネリック型パラメーター宣言では、型パラメーターが共変であることを指定します。今日のコンテキストでは、参照としてパラメーターを渡すことの最初の定義についてのみ説明します。
int number;
Method(number);
void Method(int a)
{
a = 66;
}
Console.WriteLine(number);
//输出:0
int number;
Method(out number);
void Method(out int a)
{
a = 66;
}
Console.WriteLine(number);
//输出:66
总结
上記のoutの使用法のパフォーマンスから判断すると、outとrefの両方で、実際にはパラメーターを参照によって渡すことができます。
refとoutの違い:
refを使用してパラメーターを渡す場合、refで変更されたパラメーターには値が必要ですが、outは、割り当てられていない変数をパラメーターとして使用して渡すことができます。
using System;
namespace Test_Code
{
class RefAndOut
{
public static void OutDouble(out int out_int)
{
out_int = 2;
Console.WriteLine(out_int);
}
public static void RefDouble(ref int ref_int)
{
ref_int *= 2;
Console.WriteLine(ref_int);
Console.ReadKey();
}
public static void NormalDouble(int IntPar)
{
IntPar = 1;
IntPar *= 2;
Console.WriteLine( IntPar);
Console.ReadKey();
}
static void Main(string[] args)
{
int out_int;
int ref_int;
int normalInt;
OutDouble(out out_int);
RefDouble(ref ref_int);//错误:使用了未赋值的变量refInt
NormalDouble(normalInt);//错误:使用了未赋值的变量normalInt
}
}
}
このコードには、2つの場所でエラーがあります。つまり、refが使用されている場合と、修飾子が使用されていない場合、値を持つパラメーターを渡す必要があります。ご覧のとおり、refとoutの違いはほとんど1つだけです。つまり、outは割り当てられていない変数を使用できます。
結論として:
キーワード「ref」と「out」の唯一の違いは、キーワード「out」は、渡されるパラメータ値を初期化するために呼び出し元のコードを必要としないことです。では、キーワード「ref」はいつ使用されますか?呼び出し元のメソッドがパラメーター値を初期化したことを確認する必要がある場合は、キーワード「ref」を使用する必要があります。上記の例では、「out」を使用できるのはメソッドによるものです。呼び出される渡される変数の値には依存しません。