我在采访中被问过这个问题。请帮我找到答案。
假设您有一个Employee类。它有2个变量 - 1.字符串名称2. Int年龄
现在,Employee emp = new Employee();
现在提出的问题是:
请回复您的宝贵意见。
答案 0 :(得分:34)
- 对象emp存储在内存中,即堆栈或堆中以及如何?
醇>
这个问题措辞不力。 emp
不是对象; emp
是一个变量,包含对象的引用。
让我们重新提出问题:
1(a)存储在内存中的
emp
引用的对象在哪里?
变量emp
引用的对象存储在长期存储中,也称为“堆”。
1(b)
emp
是一个变量,因此代表一个存储位置。内存中的存储位置在哪里?
这个问题没有给出足够的信息。变量emp
可以是静态字段,实例字段或局部变量。 (由于分号,它不能是形式参数。)如果是本地,它也可以是lambda的封闭外部变量,或迭代器块的本地或异步方法。所有这些都会改变变量的存储是短期存储还是长期存储。如果是短期存储,它可能在堆栈上,也可能是一个寄存器。
2
name
和age
变量存储在内存中的位置以及如何?
由于它们是类的字段,因此与这些变量关联的存储位置始终位于长期堆上。
由于name
的类型为string
,所以它引用的东西 - 一个字符串 - 也在堆上。 (或者,变量可以为null,在这种情况下,它不引用任何内容。)
3本声明中的每个单词都做了什么,即员工做了什么......然后再...然后新..然后雇员..然后()..然后;
问题非常严厉。首先,那些不是“文字”,那些是“代币”。 (()
是两个令牌。)其次,完全不清楚“do”的含义是什么。那么让我们问一个不同的问题:
3详细描述在运行时执行此声明时执行的操作。
我们不能说任何精确,因为问题中没有足够的信息。问题是它是一个声明,所以它不是一个现场声明。为简单起见,我们假设它不在迭代器块或异步方法中,并且本地不是任何匿名函数的外部变量。
首先,为变量分配短期存储空间;它可能会被注册;如果没有,它将在堆栈中。它被赋予一个空引用。
其次,要求内存分配器为堆上的Employee实例生成空内存。它会这样做,并产生对该记忆的引用。
第三,如果这是我们第一次看到Employee和Employee有一个静态构造函数,那么静态构造函数就会运行。
第四,静态ctor完成后,Employee的字段初始化程序运行。
第五,Employee的基类构造函数运行。这可能会导致其他静态构造函数执行。
第六,员工的构造函数正在运行。
第七,构造函数完成,对现在初始化对象的引用被复制到其存储中。
当然,所有这一切都假设一路上没有任何例外。
4上述陈述与
Employee emp;
有什么区别?告诉内存分配。
该问题没有足够的信息来提供准确的答案。如果从未使用局部变量,则编译器可以自由地对其进行优化。如果它没有对其进行优化,那么emp
的存储将从短期池中分配,初始化为null,并且从未使用过。
答案 1 :(得分:6)
您应该看到:堆栈是实施细节,Part One和Part Two作者Eric Lippert
1 - 对象emp存储在内存中,即堆栈或堆中以及如何?
在堆上,因为它是Employee
以来的引用类型。
2 - 名称和年龄变量存储在内存中的位置如何?
它们也存储在堆上。虽然age是值类型,但值类型存储在存储容器引用的位置。
3 - 本声明中的每个单词都做了什么,即员工是什么 do..then emp..then = .. then new .. then employee .. then().. then;
创建名为Employee
emp
类的新实例
4-上述声明与员工之间有什么区别? EMP; ?告诉内存分配。?
Employee emp;
仅表示声明,不是实例化。这意味着没有为对象分配内存,它将保留null
。
答案 2 :(得分:0)
对象emp存储在内存中,即堆栈或堆中以及如何?
它已在堆上分配,正如您所说Employee
是class
。类在堆上分配。
name
和age
变量存储在内存中的位置以及如何?
这取决于您如何使用它们,可以在不同的框架实现之间变化。一般来说,把它当作对象的记忆本身就好了。
这句话中的每个单词都做了什么,即员工做了什么..然后emp..then = ..然后新..然后雇员..然后()..然后;
您为类型Employee
分配了nececssary内存,并将其分配给指针emp
。根据它的使用方式,指针emp
被推送到堆栈或堆。
上述声明与Employee emp有何区别; ?告诉内存分配。?
Employee emp;
与编写Employee emp = default(Employee);
相同,而参考类型默认为null
,因此这等同于编写Employee emp = null;
。所以在分配方面, 应该没有任何区别。
进一步阅读: