繁体   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