配列またはリストは、デフォルトでc#の参照によって渡されますか?


84

彼らはいますか?または、プログラムを高速化するために、参照によってそれらを渡す必要がありますか?


35
プログラムを高速化するには、(1)意味のある目標を設定し、(2)目標を達成したかどうかをテストし、達成していない場合は、プロファイリングツールを使用して最も遅いものを見つけます。(4 )最も遅いものを最適化します。
Eric Lippert

1
このも参照してくださいstackoverflow.com/q/4311226/344822
prabhakaran

3
@EricLippertあなたのコメントは、投稿されたどの回答よりもはるかに優れたOPの実際の質問に答えます。誰もが「値による参照の受け渡し」の技術に気を取られて、パフォーマンスの最適化に関する本当の質問を完全に見落としていました。残念ながら、OPは彼のニーズをかなりうまく伝えておらず、他の答えは少なくともGoogleの群衆を助けるでしょう。
ダンベチャード2015

「他の答えは少なくともグーグルの群衆を助けるだろう」-彼らはそうするだろう!:)
miki

回答:


208

参照が渡される値によって

.NETの配列はヒープ上のオブジェクトであるため、参照があります。その参照は値によって渡されます。つまり、配列の内容への変更は呼び出し元に表示されますが、配列を再割り当てしても次のことは行われません。

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

ref修飾子を追加すると、参照参照によって渡されます。呼び出し元には、上記のいずれかの変更が表示されます。


28
答えは正解ですが、「参照は値で渡される」と言う人が嫌いです。それは問題を混乱させます。はい、参照(メモリアドレス)は値で渡されますが、それは問題ではありませんでした。
WernerVA 2015年

9
@WernerVA正確曖昧さのない
MarcGravell

2
私は別の言い方をしませんが、おそらくもう少し詳細に表現します。
WernerVA 2015年

これは質問の速度の部分には答えません。参照コピーの最適化は、他の何百ものはるかに高価な操作と比較して完全に無視できることはおそらくあなたには明らかですが、OPはこれを具体的に尋ねました。
ダンベチャード2015

7
@Dan速度の部分は、本質的に「配列が値で渡される場合、つまり配列の内容のコピーを意味します。つまり、すべてのメモリの割り当てとコピーを意味します」にリンクされています。それがあるので参照渡され、答えにパフォーマンス上の問題はありません-質問のその部分は、議論の余地をレンダリングし、自動的に応答されます。今を除いて、コメントでもここで明示的に回答されています...
MarcGravell

9

これらは値によって渡されますが(refでもoutでもないすべてのパラメーターと同様)、値オブジェクトへの参照であるため、事実上参照によって渡されます。


0

はい、C#ではデフォルトで参照によって渡されます。値型を除いて、C#のすべてのオブジェクトはです。もう少し正確に言うと、これらは「値による参照によって」渡されます。つまり、メソッドに表示される変数の値は、渡された元のオブジェクトへの参照です。これは小さなセマンティックポイントですが、重要な場合もあります。


9
参照は値によって渡されます。これは「参照によって渡される」とは大きく異なります。
MarcGravell

1
これは真実の正反対です。John Skeetからのこの投稿の引用:「デフォルトでは、すべてのパラメーターはC#で値によって渡されます。パラメーターは、outまたはref修飾子を明示的に含める場合にのみ参照によって渡されます。ただし、パラメーターのタイプを指定する場合は注意が必要です。は参照タイプであり、実際のオブジェクトではなく参照を渡します。」値によって渡されるのは参照(メモリアドレス)だけです。
alexlomba 8719年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.