[英]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.