2009-08-18 9 views
6

可能性の重複を使用して参照渡しです:
What’s the difference between a parameter passed by reference vs. passed by value?値渡しの間で異なっており、C#

私は難易度値渡しの違いを理解し、参照渡しを持っています。誰かが違いを説明するC#の例を提供できますか?

+3

重複http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –

+2

これは*重複した*これは具体的にはC#の例を求めていますが、参照される質問にはC#の例はありません。良い*一般的な議論の多くは、確かに、しかし、私は本当にそれも言語固有のものを持つことを痛いとは思わない。 –

+0

@Jon Skeet:既存の質問にC#の構文で答えるのは正しい解決策ではありませんか?おそらく既存の答えを編集する。 – dmckee

答えて

16

一般に、my article about parameter passingを読んでください。

基本的な考え方は次のとおりです。

引数が参照渡しされている場合は、メソッド内のパラメータ値への変更は、同様の引数に影響します。

someParameter.SomeProperty = "New Value"; 

のパラメータの値を変更ない:

微妙な部分は、パラメーターが参照型である場合、実行することです。パラメータは単なる参考値であり、上記はパラメータが参照するもの、オブジェクト内のデータだけを変更するものではありません。例については、今

someParameter = new ParameterType(); 

:ここでは、パラメータの値を変更本当にの例です

簡単な例:参照するか、

class Test 
{ 
    static void Main() 
    { 
     int i = 10; 
     PassByRef(ref i); 
     // Now i is 20 
     PassByValue(i); 
     // i is *still* 20 
    } 

    static void PassByRef(ref int x) 
    { 
     x = 20; 
    } 

    static void PassByValue(int x) 
    { 
     x = 50; 
    } 
} 

より複雑な値でint型を渡します例:参照型の使用

class Test 
{ 
    static void Main() 
    { 
     StringBuilder builder = new StringBuilder(); 
     PassByRef(ref builder); 
     // builder now refers to the StringBuilder 
     // constructed in PassByRef 

     PassByValueChangeContents(builder); 
     // builder still refers to the same StringBuilder 
     // but then contents has changed 

     PassByValueChangeParameter(builder); 
     // builder still refers to the same StringBuilder, 
     // not the new one created in PassByValueChangeParameter 
    } 

    static void PassByRef(ref StringBuilder x) 
    { 
     x = new StringBuilder("Created in PassByRef"); 
    } 

    static void PassByValueChangeContents(StringBuilder x) 
    { 
     x.Append(" ... and changed in PassByValueChangeContents"); 
    } 

    static void PassByValueChangeParameter(StringBuilder x) 
    { 
     // This new object won't be "seen" by the caller 
     x = new StringBuilder("Created in PassByValueChangeParameter"); 
    } 
} 
5

値を渡すことは、引数のコピーが渡されることを意味します。そのコピーを変更してもオリジナルは変更されません。

参照渡しとは、元の参照が渡され、参照の変更が元のものに影響することを意味します。

これはC#に固有のものではなく、多くの言語で存在します。

0

ダイジェストがある:あなたがあなたの変数を変更するための関数/メソッドを期待していたときに参照することにより

受け渡しが使用されています。

しないときに値渡し。

関連する問題