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

结构何时不存在于堆栈上?

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

    我正在读Jon Skeet的书评,他正在复习 numerous inaccuracies 属于的 Head First C# .

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

    [在错误部分]声称结构总是存在于堆栈上。

    住在烟囱里?这与我所知道的结构相反。

    6 回复  |  直到 16 年前
        1
  •  7
  •   Community Mohan Dere    8 年前

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

        2
  •  4
  •   Marc Gravell    16 年前

    每当它们是课堂上的一个字段时

    不寻常的例子:

    a: 当捕获值类型变量时:

    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 Mohan Dere    8 年前

    举个例子 the answer from 1800 INFORMATION :

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

    现在,在构造函数执行完毕后 foo.x foo。英语字母表的第24个字母 在记忆中?在堆上。什么类型的 foo。英语字母表的第24个字母 ? int System.Int32 ,这是一个结构体。

    关于捕获变量和拳击等的其他答案也是正确的(拳击案例中的“某种程度上”——我会添加一条评论),但这个例子是最简单、最重要的,IMO。

        4
  •  2
  •   G S    16 年前

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

    结构体是一种值类型。所以它的行为如上所述。

        5
  •  0
  •   ShuggyCoUk    16 年前

    • 成员字段值

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

    这本书犯了一个错误,把打字力学和示波器力学混为一谈。

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

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