首頁 >後端開發 >C++ >為什麼 C# 擴充方法的第一個參數不能是「ref」參數?

為什麼 C# 擴充方法的第一個參數不能是「ref」參數?

Barbara Streisand
Barbara Streisand原創
2025-01-07 16:57:421018瀏覽

Why Can't the First Parameter of a C# Extension Method Be a `ref` Parameter?

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中文網其他相關文章!

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