我在面试中被问到这个问题。请帮我找出答案。
假设你有个班里的员工。其中有两个变量- 1.字符串名2. Int年龄
现在,Employee emp = new Employee();
现在提出的问题是:
请回答你的宝贵意见。
发布于 2013-03-20 15:19:03
这个问题措辞拙劣。emp不是对象;emp是包含对对象的引用的变量。
因此,让我们重提这个问题:
1 (a)
emp所指的对象存储在内存中的何处?
变量emp所引用的对象存储在长期存储中,也称为“堆”。
1 (b)
emp是一个变量,因此表示存储位置。内存中的存储位置在哪里?
这个问题没有给出足够的信息来说明。变量emp可以是静态字段、实例字段或局部变量。(它不能是形式参数,因为分号。)如果是局部变量,也可以是lambda的封闭外部变量,或者迭代器块的局部变量,或者异步方法的局部变量。所有这些都会改变变量的存储是短期存储还是长期存储。如果它是在短期存储,它可能在堆栈上,也可能是一个寄存器。
2内存中存储的
name和age变量在哪里?
由于它们是类的字段,因此与这些变量相关联的存储位置总是在长期堆上。
由于name是string类型的,所以它所引用的东西--字符串--也在堆中。(或者,变量可能为null,在这种情况下,它不引用任何内容。)
这个语句中的每个词做什么,即雇员do..then emp..then =.然后是新的..。然后雇员..。然后()..then;
这个问题措辞极差。首先,这些不是“单词”,而是“记号”。( ()是两个令牌。)第二,我们完全不清楚“做”这个问题是什么意思。所以让我们问一个不同的问题:
3详细描述在运行时执行此声明时所执行的操作。
我们不能精确地说出来,因为问题中没有足够的资料。问题是它是一种声明,所以它不是字段声明。为了简单起见,让我们假设它不是在迭代器块或异步方法中,并且局部变量不是任何匿名函数的外部变量。
当然,所有这一切都假定一路上没有任何东西会抛出异常。
上述语句与
Employee emp;的区别是什么?从内存分配的角度来讲。
这个问题没有包含足够的信息来给出准确的答案。如果局部变量从未被使用过,那么编译器就可以自由地优化它。如果它不优化它,那么emp的存储将从短期池中分配,初始化为null,并且从未使用。
发布于 2013-03-20 10:06:41
您应该看到:The Stack是Eric的一个实现细节、第一部分和第二部分
1-对象emp存储在内存中的位置,即堆栈或堆中,以及如何存储?
在堆上,因为它是引用类型,因为Employee是类。
2-存储在内存中的名称和年龄变量以及如何存储?
它们也存储在堆中。虽然年龄是值类型,但值类型存储在其容器引用的存储位置。
这个语句中的每个词做什么,即雇员do..then emp..then =..。然后是新的..。然后雇员..。然后()..then;
创建Employee类的新实例,名为emp
4-上述声明与员工emp之间的区别是什么?从内存分配的角度来讲。
Employee emp;的意思是只声明,而不是实例化。这意味着没有为对象分配内存,并且它将保存null。
发布于 2013-03-20 10:11:36
对象emp存储在内存中的位置,即堆栈或堆中,以及如何存储?
它是在堆上分配的,正如您所说的,Employee是一个class。类在堆上分配。
name和age变量存储在内存中的位置以及如何存储?
这取决于您如何使用它们,并可能因框架的不同实现而有所不同。一般来说,把它想成是以对象的内存结束。
这个语句中的每个单词做什么,即employee do..then emp..then =.然后是新的..。然后雇员..。然后()..then;
您为类型Employee分配了必要的内存,并将其分配给指针emp。根据指针emp的使用方式,将指针推到堆栈或堆上。
上述声明与员工emp之间有什么区别?从内存分配的角度来讲。
Employee emp; 与写入Employee emp = default(Employee);相同,对于引用类型,默认值为null,因此这等于写入Employee emp = null;。因此,在分配方面,不应有任何不同。
请进一步阅读:
C#堆(Ing)与.NET中的堆栈(Ing):第一部分
https://stackoverflow.com/questions/15520378
复制相似问题