代码之家  ›  专栏  ›  技术社区  ›  mmcdole

结构何时不在堆栈上?

  •  5
  • mmcdole  · 技术社区  · 16 年前

    我正在阅读乔恩·斯基特的书评,他正在浏览 numerous inaccuracies 属于 Head First C# .

    其中一个引起了我的注意:

    [在错误部分下]声明结构始终位于堆栈上。

    在什么情况下,structs 住在堆栈上?这与我认为我知道的结构相反。

    6 回复  |  直到 16 年前
        1
  •  7
  •   Community CDub    7 年前

    一个常见的例子是,结构是在堆中分配的对象的成员。在这个问题中有很多额外的细节。 What’s the difference between struct and class in .Net?

        2
  •  4
  •   Marc Gravell    16 年前

    这方面的不同寻常的例子:

    答:捕获值类型变量时:

    int i = 2;
    Action action = delegate {i++;}
    action();
    Console.WriteLine(i);
    

    这被编译成更像:

    class Foo {
        public int i;
        public void Bar() {i++;}
    }
    ...
    Foo foo = new Foo();
    foo.i = 2;
    Action action = foo.Bar;
    action();
    Console.WriteLine(foo.i);
    

    b:在迭代器块中使用值类型变量时:

    IEnumerable<int> GetValues() {
       for(int i = 0 ; i < 5 ; i++) yield return i;
    }
    

    i )是字段)

        3
  •  2
  •   Community CDub    7 年前

    举个例子 the answer from 1800 INFORMATION :

    public class Foo
    {
        int x;
    
        public Foo(int y)
        {
            x = y;
        }
    }
    
    ...
    
    Foo foo = new Foo(10);
    

    现在,在构造函数完成执行之后 foo.x 是10岁。在哪里 foo.x foo.x int 又称作 System.Int32 ,这是一个结构。

    关于捕获的变量和装箱等的其他答案也是正确的(“装箱箱中的“排序”-我将添加一条注释),但是这个例子是最简单和最重要的一个,IMO。

        4
  •  2
  •   G S    16 年前

    value type 得到 boxed ,长方体以及实例本身被移动到堆中。尽管如此,毫无疑问,第一次创建非类成员值类型实例时总是在堆栈上创建。

        5
  •  0
  •   ShuggyCoUk    16 年前

    已经被其他人深入提到

    • 装箱结构(严格来说,它们不再是值类型)

    此外:

    • 结构数组完全驻留在堆上
    • 静态结构(不是在堆栈或堆上,而是在一个特殊的区域中,它们都是自己的)
        6
  •  0
  •   Lee Louviere    13 年前

    值类型不是引用类型。当您使用它作为参数(不带ref或out)调用方法时,会复制它的数据。 值类型将位于方法范围内的堆栈上,而不是像引用对象那样位于堆上,但这并不意味着它将始终位于堆栈上。

    因此,这本书用用法陈述代替了力学陈述,混淆了两者。这不是毫无根据的说法,但它是错误的。

    值类型将保留在其所有者所在的任何位置。

    有了它,可以很安全地说,一个值类型最好保持不变,因为大多数人很难通过值来预测值类型的机制。