ホームページ >バックエンド開発 >C++ >C# の配列とリストは参照渡しですか、それとも値渡しですか?

C# の配列とリストは参照渡しですか、それとも値渡しですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 10:07:41904ブラウズ

Do C# Arrays and Lists Pass by Reference or by Value?

C# で配列またはリストを参照によって渡す

C# の配列またはリストは、デフォルトでは参照または値によって渡されますか?パフォーマンスを最適化しようとするときに、この質問がよく起こります。その答えを探り、効率性を考えると参照による受け渡しが賢明な選択であるかどうかを議論してみましょう。

答え:

C# では、配列とリストは参照ではなく値によって渡されます。これは、実際の配列またはリスト自体ではなく、配列またはリストへの参照が関数呼び出しにコピーされることを意味します。

配列またはリストが関数に渡されると、ヒープ上の参照がスタックにコピーされます。参照がメモリ内の同じ場所を指しているため、関数内の配列またはリストの内容に加えられた変更は呼び出し元に表示されます。ただし、配列またはリスト自体を再割り当てしようとする試み (つまり、参照の変更) は、呼び出し元のスコープには反映されません。

<code class="language-c#">void Foo(int[] data) {
    data[0] = 1; // 调用者可以看到此更改
}
void Bar(int[] data) {
    data = new int[20]; // 但看不到此更改
}</code>

上記の例では、Foo は配列の最初の要素を変更し、この変更は呼び出し元に表示されます。ただし、Bar は、呼び出し元には見えない新しい配列をデータに割り当てます。

参照渡しには「ref」修飾子を使用します

呼び出し元に参照自体への変更を確認させる必要がある場合は、ref 修飾子を使用できます。パラメータが ref によって渡される場合、コピーではなく実際の参照が渡されます。これは、関数内の参照への変更が呼び出し元のスコープに反映されることを意味します。

<code class="language-c#">void Foo(ref int[] data) {
    data = new int[20]; // 调用者可以看到此更改
}</code>

最適化の提案

配列またはリストを参照によって渡すことはパフォーマンスを向上させる方法のように思えるかもしれませんが、一般的には推奨されません。値渡しにより、配列またはリストへの変更が関数内でローカライズされ、プログラムの他の部分への意図しない変更が防止されます。さらに、最新の .NET オプティマイザーは、多くの場合、手動介入なしで値渡しを効率的に処理できます。

以上がC# の配列とリストは参照渡しですか、それとも値渡しですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。