结构和IDisposable

Ale*_*dre 14 .net c# idisposable using

我想知道为什么不编译?

public static void Main(string[] args)
{
    using (MyStruct sss = new MyStruct())
    {

        sss.s = "fsdfd";// Cannot modify members of 'sss' because it is a 'using variable' 

        //sss.Set(12);    //but it's ok
    }
}

public struct MyStruct : IDisposable
{
    public int n;
    public string s;

    public void Set(int n)
    {
        this.n = n;
    }
    public void Dispose()
    {
        Console.WriteLine("dispose");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:但它完美无缺.为什么?

public static void Main(string[] args)
        {

            using (MyClass sss = new MyClass())
            {
                sss.Field = "fsdfd"; 
            }


        }

public class MyClass:IDisposable {

    public string Property1 { get; set; }
    public string Field;
    public void Method1 (){}

    public void Dispose()
    {
        Console.WriteLine("dispose class");
    }
 }
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 20

很多人都把我的文章与变异值类型以及为什么这是一个坏主意联系起来.虽然理解这些概念很重要,但在理解为什么它是一个糟糕的想法来处理一个结构,而更糟糕的想法是在你做的时改变结构,这实际上并不是正确的链接文章.您想要阅读的那个以令人难以忍受的细节解释所有这些:

http://ericlippert.com/2011/03/14/to-box-or-not-to-box/

简而言之:"使用"会复制值类型,因此您将处理副本.这意味着你必须非常小心 - 如果值是一个操作系统句柄,那么该值的许多副本可能存在于内存中,并且你需要确保你准确地处理它一次无论如何有多少份.

另请参见如果我的struct实现了IDisposable,它将在using语句中使用时被装箱吗?


Hen*_*man 3

类和结构场景实际上是相同的,但您会看到不同的效果。

当您将类示例更改为:

using (MyClass sss = new MyClass())
{
    sss = null;          // the same error
    sss.Field = "fsdfd"; // ok
}
Run Code Online (Sandbox Code Playgroud)

在第一个作业中您将遇到相同的错误。

解释是:您无法更改(变异)using-variable。但对于适用于引用而不是实例的类。

教训是:不要使用结构。特别是不要使用可变结构。

  • @Alex:“可变”的东西是可以改变(变异)的东西。可以更改其值的结构称为可变结构,通常被认为是不好的结构。更多阅读:[为什么可变结构是邪恶的?](http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil) (2认同)