C# 擴充方法與「ref」修飾符:理解「this」參數的細微差別
C# 擴充方法透過新功能增強現有類型,而無需更改其原始程式碼。 然而,當將 ref
修飾符與 this
參數一起使用時,會出現一個關鍵的區別,特別是關於它如何影響正在擴展的實例。
ref
擴充方法參數中的修飾符
擴充方法可以接受由ref
修改的參數,從而允許更改原始值。 考慮:
<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
這是有效的,因為 ref
修改了常規參數。
對ref this
將 ref
應用於 this
參數時會出現限制:
<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
這會產生編譯器錯誤。
歷史背景(C# 7.2 之前)
在 C# 7.2 之前,此限制源自於編譯器限制。編譯器以不同方式處理 this
參數,阻止 ref
語意。
C# 7.2 及更高版本:啟用 ref this
C# 7.2 解決了這個限制。 現在,ref
可以與 this
參數一起使用,特別有利於修改值類型(結構)。
實際應用:修改結構
在使用結構時,此功能被證明是非常寶貴的,可以在擴展方法中進行就地修改。 例如:
<code class="language-csharp">public struct MyData { public string Value { get; set; } } public static class MyDataExtensions { public static void UpdateValue(this ref MyData data, string newValue) { data.Value = newValue; } }</code>
這裡,UpdateValue
直接改變Value
結構體的MyData
屬性。 這避免了創建新的結構體實例,從而提高了效能。
以上是為什麼 C# 擴充方法中「ref」不能與「this」參數一起使用(C# 7.2 之前)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!