2012-04-23 4 views
1

私は気づいた。ネットは私たちがこのようにすることを可能にします。キーワード "ref"を使用してClassオブジェクトを渡す用途は何ですか?彼らはデフォルトで参照渡しとなります

public void Func1(ref String abc) 
    { 
    } 

「ref」というキーワードは意味がありますか? Stringはクラス(参照型)であるため、

とは異なります。

public void Func1(String abc) 
{ 
} 

私は混乱しているように頼んでいます。いくつかのコンセプトが欠落しているか、同じものであり、 "ref"キーワードはこの文脈では意味がありません。

+0

["ref"のキーワードと参照の種類]と同じです(http://stackoverflow.com/questions/4656184/ref-keyword-and-reference-types) –

+0

「ref」キーワードについては、msdnのマニュアルを参照してくださいそれはかなりそれを説明します:http://msdn.microsoft.com/en-us/library/14akc2c7.aspx – Magnus

答えて

2

パラメータは、デフォルトでに渡されます。メソッドにパラメータを渡すと、元の変数は変更されません。ただし、パラメーターをrefパラメーターとして渡すと、渡された元の変数が変更される可能性があります。

これを試してください:あなたが得る

public void Func1(String abc) { 
    abc = "Changed from Func1"; 
} 

public void Func2(ref String abc) { 
    abc = "Changed from Func2"; 
} 

public void main() { 
    string foo = "not changed"; 
    Func1(foo); 
    Console.WriteLine(foo); 
    Func2(ref foo); 
    Console.WriteLine(foo); 
} 

出力は次のようになります。

fooのコピーが同じ文字列を指しており、作成され Func1
not changed 
Changed from Func2 

。しかし、別の値を割り当てるとすぐに、パラメータabcは別の文字列を参照します。 fooは変更されておらず、引き続き同じ文字列を指しています。
に参照を渡すので、abcに新しい値(別の文字列への参照)を割り当てると、実際にはfooに新しい値が割り当てられます。

+0

私はあなたが言及したように動作しようとしました。私は少し混乱しています。 String ---> Class、Class ---> Refrence型、Refrence型の値は関数内で変更されます。 Func1によって作られたWhuの変更は反映されなかった??? – Pritesh

+0

'foo'は、オブジェクト自体ではなくStringオブジェクトへのポインタを含んでいると考えてください。 'Foo'を(' Func1'のように)コピーすると、新しいStringオブジェクトへのポインタを 'foo'のコピーに代入するので、元の変数は変更されず、引き続き同じStringオブジェクトを指します。私は \t \t \t公共フロート率= 10 \tパブリッククラスEmployee {ようなクラスがあると仮定 – Botz3000

+0

。 \t \t 私は関数Foo(従業員)に渡して、 "レート"値20を割り当てた後、アクセスするとレート20を取得します。 これは参照渡しの私の理解です。機能内で行われた変更は外部に反映されます。なぜそれがStringの場合に起こらなかったのでしょうか? – Pritesh

1

デフォルトでは、refキーワードがないと、文字列ポインタのコピーが作成されます(値渡し)。 refを使用すると、参照渡しが行われ、元の呼び出し元のポインタを変更することもできます。

+0

"元の呼び出し元のポインタを変更することができます"それは私がobjcetをポイントすることができますabcを意味しますか従業員のような他のタイプ(クラス)? – Pritesh

+1

いいえ、発信者の変数を変更することはできますが、正しいタイプが必要です。 –

関連する問題