首頁 > 後端開發 > C++ > 為什麼 C# 擴充方法中「ref」不能與「this」參數一起使用(C# 7.2 之前)?

為什麼 C# 擴充方法中「ref」不能與「this」參數一起使用(C# 7.2 之前)?

Patricia Arquette
發布: 2025-01-07 16:41:43
原創
341 人瀏覽過

Why Can't

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板