簡體   English   中英

在using語句中修改值類型變量

[英]modify a value-type variable in a using statement

在C#中,如果我具有以下結構:

internal struct myStruct : IDisposable
{
    public int x;

    public void Dispose()
    {
        x = 0;
    }
}

然后在Main中執行以下操作:

using (myStruct myStruct = new myStruct())
{
   myStruct.x = 5;
}

它不能說myStruct是只讀的。 這很有意義,因為myStruct是一種值類型。

現在,如果將以下功能添加到struct中:

public void myfunc(int x)
{
    this.x = x;
}

並將主代碼更改為此:

using (myStruct myStruct = new myStruct())
{
    myStruct.myfunc(5);
    Console.WriteLine(myStruct.x);
}

有用。 為什么呢

簡短的答案是“因為C#規范是這樣說的”。 我承認,這可能有些令人不滿意。 但是,就是這樣。

可以肯定的是,正如評論者Blogbeard所言,這樣做的動機是:雖然對字段訪問強制實施只讀是可行的,但在類型內執行只讀操作卻並不可行。 畢竟,類型本身無法知道如何聲明包含該類型值的變量。

C#規范(來自v5.0規范)的關鍵部分在此處,在第258頁(在using語句的部分中):

在資源獲取中聲明的局部變量是只讀的,並且必須包含初始化程序。 如果嵌入式語句嘗試修改這些局部變量(通過賦值或++和運算符),獲取其地址或將其作為ref或out參數傳遞,則會發生編譯時錯誤。

由於在值類型的情況下,變量本身包含對象的值,而不是對對象的引用,因此,通過該變量修改對象的任何字段與修改變量相同,因此,“通過分配”,這是規范明確禁止的。

這與使用readonly修飾符將值類型變量聲明為另一個對象中的字段的情況完全相同。

但是請注意,這是由C#編譯器強制執行的編譯時規則,並且編譯器無法類似地對自己修改的值類型強制執行該規則。


我將指出,這是許多絕不應該實現可變值類型的絕妙原因之一。 可變值類型經常在您不希望被修改時就可以被修改,而與此同時,您發現自己卻不想被修改(在與此完全不同的場景中)。

如果您將值類型視為真正的值,即,一個永不改變的值,則它們會更好地工作,並且發現自己處於更少的錯誤中間。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM