首頁 >後端開發 >C++ >C# 陣列和列表是按引用傳遞還是按值傳遞?

C# 陣列和列表是按引用傳遞還是按值傳遞?

Barbara Streisand
Barbara Streisand原創
2025-01-10 10:07:41870瀏覽

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將一個新數組賦值給data,這對於呼叫者是不可見的。

使用'ref'修飾符進行引用傳遞

如果您需要呼叫者看到對參考本身的更改,可以使用ref修飾符。當參數按ref傳遞時,傳遞的是實際引用,而不是副本。這意味著函數內對引用的任何更改都將反映在呼叫者的範圍內。

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

最佳化建議

雖然按引用傳遞數組或列表似乎是提高效能的一種方法,但通常不建議這樣做。按值傳遞可確保對陣列或清單的任何修改都局限於函數內,防止程式其他部分出現意外變更。此外,現代.NET優化器通常可以有效地處理按值傳遞,而無需手動幹預。

以上是C# 陣列和列表是按引用傳遞還是按值傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn