C# 參數傳遞:值傳遞與引用傳遞的深入探討
C# 中,值傳遞和引用傳遞是程序員必須掌握的基本概念。雖然通常認為非原始類型是引用傳遞,但對於某些非原始對象(例如 System.Drawing.Image)來說,情況並非總是如此。
System.Drawing.Image 對象的特殊性
將 System.Drawing.Image 對像傳遞給方法並向其中加載圖像時,我們通常期望原始對像在返回後反映這些更改。然而,對於 System.Drawing.Image 並非如此。在被調用方法中所做的更改不會傳播回調用方,從而導致混淆。
“引用傳遞”的真相
這種誤解源於對引用傳遞含義的誤解。在 C# 中,對象本身不會被傳遞。相反,它們的值作為初始參數值按值傳遞。對於引用類型,這些值是對對象本身的引用。因此,在被調用方法中對對象本身所做的任何更改都將對調用方可見。
但是,重要的是要注意,參數本身的值(即對對象的引用)不是按引用傳遞的。這意味著如果參數被分配一個新值,引用一個不同的對象,則調用方將看不到此更改。
解決方案:顯式引用傳遞
為了確保對參數本身的更改對調用方可見,必須使用顯式引用傳遞。無論參數是值類型還是引用類型,這都可以通過 out
或 ref
修飾符來實現。
通過使用這些修飾符,參數實際上是按引用傳遞的,並且在方法中對其所做的更改將反映在調用方中。
示例
為了說明這個概念,請考慮以下示例:
<code class="language-csharp">public void Foo(Image image) { // 此更改对调用方不可见。 image = Image.FromStream(...); } public void Foo(ref Image image) { // 此更改对调用方可见。 image = Image.FromStream(...); } public void Foo(Image image) { // 此更改对调用方可见。 image.RotateFlip(...); }</code>
在第一個示例中,參數按值傳遞,對參數本身的更改對調用方不可見。在第二個示例中,使用 ref
修飾符顯式地按引用傳遞參數,對參數本身的更改是可見的。在第三個示例中,參數按引用傳遞,但對對象本身的更改是可見的,因為參數值是對對象的引用。
結論
C# 中的引用傳遞是一個細微的概念,其行為並不總是像我們直覺上期望的那樣。理解按引用傳遞對象與按引用傳遞值之間的區別對於編寫按預期方式運行的代碼至關重要。
以上是C#參數傳遞如何真正起作用:值與參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!