2016-06-24 1 views
-2

私はTroelsenとSchildtの本でこれについて読んだ。そして今私は混乱している。この質問の彼らの意見は異なっている.Schildtは、refを使って整数型を渡す場合、関数は変数がヒープにどこにあるのかを示します.Troelsenは、関数がoriignalのコピーを取得することを説明しています。もし可能であれば、refrefce型がrefを渡したときに、大文字の小文字を聞くことができるでしょうか...ref修飾子は値型と参照型でどのように動作しますか?誰かが徹底的に説明できますか?

+2

http://pobox.com/~skeet/csharp/parameters.htmlを参照してください - 私の推測では、あなたはTroelsenを誤解しています。 –

+0

ありがとうございます。Mr Skeet – NeoXX

+0

@ JonSkeetの記事は、あなたが知る必要があるだけです。 – Andrew

答えて

3

変数をrefを使用するメソッドの引数として使用する場合、引数を渡すだけでなく、メソッド自体に変数のコントロールを渡していることになります。 (あなただけref、ないプロパティを使用して変数を渡すことができた理由です。)

私は変数

var x = 1; 

を持っていると私はその後ref

void DoSomethingWith(int arg) 
{ 
    arg++; 
} 

DoSomethingWith(x); 

なし方法にそれを渡す場合その方法はDoSomethingWithargで何でもできます。しかし、呼び出し元のメソッドのために、xはまだ1

に等しくなります。しかし、私は合格した場合には、その後、私は私の変数、xオーバーその方法の制御を与えているref

void DoSomethingWith(ref int arg) 
{ 
    arg++; 
} 

DoSomethingWith(ref x); 

を使用します。 argに1を加えると、xに1が加算されます。

refを使用するかどうかにかかわらず、メソッドはオブジェクトの状態を変更することができるため、参照型と少し混乱します。たとえば、List<object>をメソッドに渡すと、そのメソッドはrefを使用したかどうかにかかわらず、リストに項目を追加または削除できます。

さらに、refを使用すると、このメソッドは変数を制御します。異なるList<object>を作成し、変数に割り当てることができます。変数をnullに設定できます。 refを使用しないと、それはできません。 refなし - - 私は、このメソッドを呼び出した場合

「ハロー!」と

void DoSomethingWithList(List<string> list) 
{ 
    list.Add("Hello!"); 
    list = new List<string>(); 
    list.Add("Goodbye!"); 
} 

これが追加されます文字列のリストを渡します私が渡したリストに追加します。しかし、メソッドに渡された変数には影響しない新しいList<string>が作成されます。その変数は引き続き同じリストを参照し、今や文字列 "Hello!"それに加えられた。

しかし、それは私が渡されたどんな変数その後、ref

void DoSomethingWithList(ref List<string> list) 
{ 
    list.Add("Hello!"); 
    list = new List<string>(); 
    list.Add("Goodbye!"); 
} 

を使用している場合は、新しいリストに置き換えられます。メソッドの実行が完了すると、my変数には、「さようなら!」という単語を含む新しいList<string>が含まれます。

ここにはblog postの例がいくつかあります。

documentationrefについてはこれが説明されています。しかし、多くのドキュメンテーションのように、読みやすく、理解しやすいことよりも正確です。一度それを理解すれば、これは完璧な意味がありますが、あなたがそれを知らないと理解しにくいことがわかります。

参照渡しの効果は、呼び出されたメソッドのパラメータ への変更が呼び出しメソッドに反映されることです。たとえば、 呼び出し元がローカル変数式または配列要素 アクセス式を渡し、呼び出されたメソッドがrefパラメータが参照する のオブジェクトを置き換えた場合、呼び出し元のローカル変数または 配列要素が新しいオブジェクト。

多分それは私だけだが、私はちょうどそれは、誰かがrefのようなものについての情報を探していると、「配列要素 アクセス表現」などの用語がでスローされます。それはロケットではないにもかかわらずあれば便利だとは思いません新しい概念を把握しようとする人に少しでも負担をかけることになります。

+0

ありがとうございます – NeoXX

関連する問題