私はTroelsenとSchildtの本でこれについて読んだ。そして今私は混乱している。この質問の彼らの意見は異なっている.Schildtは、refを使って整数型を渡す場合、関数は変数がヒープにどこにあるのかを示します.Troelsenは、関数がoriignalのコピーを取得することを説明しています。もし可能であれば、refrefce型がrefを渡したときに、大文字の小文字を聞くことができるでしょうか...ref修飾子は値型と参照型でどのように動作しますか?誰かが徹底的に説明できますか?
答えて
変数をref
を使用するメソッドの引数として使用する場合、引数を渡すだけでなく、メソッド自体に変数のコントロールを渡していることになります。 (あなただけref
、ないプロパティを使用して変数を渡すことができた理由です。)
私は変数
var x = 1;
を持っていると私はその後ref
void DoSomethingWith(int arg)
{
arg++;
}
DoSomethingWith(x);
なし方法にそれを渡す場合その方法はDoSomethingWith
はarg
で何でもできます。しかし、呼び出し元のメソッドのために、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
のようなものについての情報を探していると、「配列要素 アクセス表現」などの用語がでスローされます。それはロケットではないにもかかわらずあれば便利だとは思いません新しい概念を把握しようとする人に少しでも負担をかけることになります。
ありがとうございます – NeoXX
- 1. 誰かがどのようにこの作品を説明できますか?
- 2. 誰かがこのジェネリック型のプリミティブ型の使用をJavaで説明することはできますか?
- 3. 誰かが "conj"の動作を説明できますか?
- 4. ポインタはどのようにして別の型を参照できますか?
- 5. C#の参照型とrefの違いは何ですか?
- 6. 誰かがsize_t型を例として使用する理由を誰でも説明できますか?
- 7. は誰がどのように私に説明できますか?
- 8. はインスタンス参照ではアクセスできません。型名で修飾代わり
- 9. Varまたは動的変数参照型または値型?
- 10. finalキーワードはJavaの型修飾子ですか? Javaでは
- 11. 誰かがこのRxjavaの動作を私に説明できますか?
- 12. 誰かが5のように私にpython-twistedを説明できますか?
- 13. ボックス型の値型とリフレクションなしの参照型を区別できます
- 14. Delphiのジェネリックメソッドで型識別子を完全修飾するにはどうすればよいですか?
- 15. 誰も私にリンクを説明したり参照したりすることはできますか?
- 16. mongooseで混合データ型とバッファデータ型の意味を説明できますか?
- 17. C#の参照型のメモリに関する明示的なキャストの説明
- 18. Cで不透明データ型を説明できますか?
- 19. 誰かがどのようにAppBarLayoutとCollapsingToolbarLayoutを説明することができますか?
- 20. 誰かが私にこのエラーを説明できますか?
- 21. 誰かが私にこのコードを説明できますか?
- 22. 誰かが私にこのバッチファイルを説明できますか?
- 23. これはどのように可能ですか?誰かがこれを説明できますか?
- 24. ClojureでプリミティブなJava型をどのように参照していますか?
- 25. 誰かがデコーダー/エンコーダーをよく説明できますか?
- 26. これはどのようにjavascriptで2になるのですか誰でも説明できますか?
- 27. 値型/参照型制約はいつC#で役に立ちますか?
- 28. 誰かがHaskellでこのIntegerモジュラ動作を私に説明することはできますか?
- 29. python tuple、誰かがこの動作を説明できますか?
- 30. 誰かがWaitForSeconds()について説明できますか?
http://pobox.com/~skeet/csharp/parameters.htmlを参照してください - 私の推測では、あなたはTroelsenを誤解しています。 –
ありがとうございます。Mr Skeet – NeoXX
@ JonSkeetの記事は、あなたが知る必要があるだけです。 – Andrew