質問

明確、簡潔、正確な答えを探しています。

理想的には実際の答えですが、適切な説明へのリンクは歓迎します。

これは VB.Net にも当てはまりますが、キーワードが異なります。 ByRef そして ByVal.

役に立ちましたか?

解決

デフォルト (C# の場合) では、オブジェクトを関数に渡すと、実際にはそのオブジェクトへの参照のコピーが渡されます。パラメーター自体を変更すると、パラメーターの値のみが変更され、指定された変数は変更されません。

void Test1(string param)
{
    param = "new value";
}

string s1 = "initial value";
Test1(s1);
// s1 == "initial value"

使用する out または ref 関数の呼び出しで指定された変数への参照を渡します。の値の変更 out または ref パラメータは呼び出し元に返されます。

両方 out そして ref 1 つのわずかな違いを除いて、同じように動作します。 ref パラメータは呼び出す前に初期化する必要がありますが、 out パラメータは初期化されていない可能性があります。拡張によって、 ref パラメータはメソッドの開始時に初期化されることが保証されていますが、 out パラメータは初期化されていないものとして扱われます。

void Test2(ref string param)
{
    param = "new value";
}

void Test3(out string param)
{
    // Use of param here will not compile
    param = "another value";
}

string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"

編集:として DP との違いを指摘する out そして ref これは C# コンパイラによってのみ適用され、CLR によって適用されるわけではありません。私の知る限り、VB には同等のものはありません。 out そして実装する ref (として ByRef) のみ、CLR のサポートに一致します。

他のヒント

ref と外:2 つの区別は、C# コンパイラによって強制されます。CLR は out と ref を区別しません。これは、out または ref だけが異なるシグネチャを持つ 2 つのメソッドを使用することはできないことを意味します。

void foo(int value) {}

// Only one of the following would be allowed

// valid to overload with ref
void foo(ref int value) {}

// OR with out
void foo(out int value) {}

out パラメータが次のメソッドによって初期化されることを意味します。

int result; //not initialised

if( int.TryParse( "123", out result ) )
   //result is now 123
else
   //if TryParse failed result has still be 
   // initialised to its default value (0)

ref 基になる参照が強制的に渡されます。

void ChangeMyClass1( MyClass input ) {
   input.MyProperty = "changed by 1";
   input = null;
   //can't see input anymore ... 
   // I've only nulled my local scope's reference
}

void ChangeMyClass2( ref MyClass input ) {
   input.MyProperty = "changed by 2";
   input = null;
   //the passed reference is now null too.
}

MyClass tester = new MyClass { MyProperty = "initial value" };

ChangeMyClass1( tester );
// now tester.MyProperty is "changed by 1"

ChangeMyClass2( ref tester );
// now tester is null

stackoverflow での私自身の質問の 1 つでも、このトピックを扱っています。
について扱います 「参照渡し」と「値渡し」 さまざまな種類の言語で、 c#が含まれています そこで追加の情報も見つかるかもしれません。

基本的には次のようになります。

  • 参照:ref キーワードを含むパラメータが渡されます 参照により
  • 外:out キーワードを含むパラメーターは、 出力パラメータ

しかし、ここで説明されているものよりも少し複雑なので、これが実際に与えることができる最も基本的な答えです。

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