我一直在问这个问题采访。 请帮我找到它的答案。
假设你有一个Employee类。 有2个变量的原因 - 1.字符串名称2.诠释年龄
现在, Employee emp = new Employee();
现在问的问题是:
- 当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?
- 当存储在内存中,以及如何将名字和年龄变量?
- 是什么在此声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,
- 是什么上述声明和员工EMP之间的区别; ? 告诉在内存分配方面?
请您宝贵的意见答复。
- 当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?
现在的问题是措辞不当。 emp
不是一个对象 ; emp
是含有对一个对象的引用的变量 。
因此,让我们改写的问题:
图1(a)如果所述目的是通过称为emp
存储在存储器?
由变量引用的对象emp
被存储在长期储存,也被称为“堆”。
图1(b) emp
是可变的,并且因此代表的存储位置。 哪里是在内存中的存储位置?
这个问题没有给予足够的信息说。 可变emp
可能是一个静态字段,实例字段或局部变量。 (它不能是一个正式的参数,因为分号)。如果在本地,它也可以是一个lambda的闭合过外层变量,或本地迭代器块的,或异步方法的。 所有这些都将改变变量的存储是否在短期或长期存储。 如果它是在短期储存它可能是在堆栈上,或者它可以是一个寄存器。
2哪里name
和age
存储在内存中,以及如何变量?
由于他们是一类的领域,与这些变量相关的存储位置总是在长期堆。
由于name
的类型为string
,它指的是东西-一个字符串-也是在堆上。 (或者,变量可以为空,在这种情况下,它并不是指什么。)
3这是什么在这个声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,
现在的问题是非常严重的措辞。 首先,这些都不是“字”,这些都是“令牌”。 (和()
是两个符号)。第二,它是完全不清楚的问题是指“做”什么。 因此,让我们问一个不同的问题:
3详细当此声明执行在运行时执行的操作描述。
我们无法确切说,因为没有在这个问题足够的信息。 这个问题说,这是一个语句,所以它不是一个字段声明。 让我们假设为简单起见,它不是在迭代器块或异步方法,并且该本地没有任何匿名函数的外变量。
首先,短期存储被分配用于变量; 它很可能是enregistered; 如果不是,它会在堆栈中。 它被赋予一个空引用。
其次,内存分配器被要求出示空的内存员工对堆一个实例。 它这样做,并产生到存储器中的参考。
第三,如果这是我们见过的员工和员工都有一个静态构造函数的第一次,静态构造函数运行。
四,静态构造函数完成后,员工的字段初始化运行。
第五,员工的基类的构造函数运行。 这可能会导致其他的静态构造函数来执行。
六,员工的构造函数体中运行。
第七,构造完成,到现在初始化对象的引用被复制到它的存储器。
这门课程的所有假设,没有什么沿途抛出异常。
4是什么上面的语句之间的差异Employee emp;
? 告诉在内存分配方面。
这个问题不包含足够的信息来给出一个准确的答案。 如果局部变量从未则使用的编译器就可以优化它拿走。 如果不优化它扔掉然后储存emp
被分配掉短期池,初始化为null,并且从未使用过。
您应该看到: 协议栈的实现细节 , 第一部分和第二部分通过埃里克利珀
1 - 何处存储在存储器中的对象中的emp堆栈或堆,以及如何,即?
上堆 ,因为其由于引用类型Employee
是一个类。
2 - 当存储在内存中,以及如何将名字和年龄变量?
他们还保存在堆。 虽然年龄是值类型,但值类型存储它们的容器引用的存储位置。
3 - 什么是在这个语句中的每个词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,
创建的新实例Employee
类名为emp
4-是什么上面的语句和员工EMP之间的区别; ? 告诉在内存分配方面?
Employee emp;
意味着只是声明, 没有实例 。 这意味着没有内存分配给对象,将持有null
。
当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?
它分配在堆中 ,因为你说, Employee
是class
。 类是分配在堆。
凡name
和age
存储在内存中,以及如何变量?
这取决于你如何使用它们, 可以在不同的框架,实行之间变化。 在一般情况下,想起来,好像他们与对象的内存本身结束。
是什么在此声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,
您分配nececssary内存类型Employee
,并将其分配到指针emp
。 指针emp
被压入堆栈或堆的基础上,如何使用它。
是什么上述声明和员工EMP之间的区别; ? 告诉在内存分配方面?
Employee emp;
是一样的写入Employee emp = default(Employee);
和引用类型默认为一个null
,所以这是等于写入Employee emp = null;
。 因此,在分配方面应该不会成为任何区别。
进一步阅读:
C#堆在.NET(荷兰国际集团)与堆栈(荷兰国际集团):第一部分