C# 擴充方法:為什麼第一個參數不能是 ref
(大多數)
擴充方法可以優雅地為現有類型添加功能,而無需更改其原始程式碼。 但是,有一個關鍵限制:第一個參數(表示方法所操作的實例)不能是 ref
參數(下面指出的例外情況)。
限制背後的原因
ref
關鍵字允許方法直接修改作為參數傳遞的變數的值。在標準方法呼叫中,這是完全可以接受的。但對於擴展方法,第一個參數隱式表示呼叫擴展的物件。 設定此參數ref
將從根本上改變擴展方法的工作方式。
擴充方法擴充類型的行為;它不會取代或建立新實例。 在第一個參數上允許使用 ref
參數將有效地讓擴展方法用完全不同的對象替換原始對象,從而打破了擴展方法的核心概念。
說明性範例
考慮常規方法:
<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj) { obj = newObj; //Directly replaces the original object }</code>
現在,想像一個類似的擴充方法(假設允許):
<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj) { obj = newObj; //Would replace the original object }</code>
這個假設的擴充方法不會修改原始的obj
,而是將一個新物件分配給引用它的變數。這種行為與擴展方法的預期目的不一致。
C# 7.2 和值型態:異常
雖然此限制通常適用於引用類型(類別、介面),但 C# 7.2 引入了值類型(結構)的例外。 對於結構,在第一個參數 ref
上使用 是 允許的。
這允許創建可以修改結構內部狀態的擴展方法。 但是,請務必記住此異常僅適用於值類型,而不適用於引用類型。 保留原始實例的核心原則仍然適用於引用類型。
以上是為什麼 C# 擴充方法的第一個參數不能是「ref」參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!