nit*_*gri 6 c# memory asp.net allocation class
我在采访中被问到这个问题.请帮我找到答案.
假设您有一个Employee类.它有2个变量 - 1.字符串名称2. Int年龄
现在, Employee emp = new Employee();
现在提出的问题是:
请回复您的宝贵意见.
Eri*_*ert 35
- 对象emp存储在内存中,即堆栈或堆中,如何?
问题是措辞不力.emp不是一个对象 ; emp是一个变量,其还包括一参考的对象.
那么让我们重新提出问题:
1(a)
emp存储在存储器中的对象在哪里?
变量引用的对象emp存储在长期存储中,也称为"堆".
1(b)
emp是变量,因此代表存储位置.内存中的存储位置在哪里?
这个问题没有给出足够的信息.变量emp可以是静态字段,实例字段或局部变量.(由于分号,它不能是形式参数.)如果是本地,它也可以是lambda的封闭外部变量,或迭代器块的本地或异步方法.所有这些都会改变变量的存储是短期存储还是长期存储.如果是短期存储,它可能在堆栈上,也可能是一个寄存器.
2
name和age变量存储在内存中的位置和方式如何?
由于它们是类的字段,因此与这些变量关联的存储位置始终位于长期堆上.
由于name是类型string,它引用的东西 - 一个字符串 - 也在堆上.(或者,变量可以为null,在这种情况下,它不会引用任何内容.)
3本声明中的每个单词都做了什么,即员工做了什么......然后再...然后新...然后雇员..然后()..然后;
这个问题的措辞非常糟糕.首先,那些不是"文字",那些是"代币".(并且()是两个令牌.)其次,完全不清楚问题的意思是"做".那么让我们问一个不同的问题:
3详细描述此声明在运行时执行时执行的操作.
我们不能说任何精确,因为问题中没有足够的信息.问题是它是一个声明,所以它不是一个现场声明.为简单起见,我们假设它不在迭代器块或异步方法中,并且本地不是任何匿名函数的外部变量.
首先,为变量分配短期存储; 它可能会被注册; 如果没有,它将在堆栈中.它被赋予一个空引用.
其次,要求内存分配器为堆上的Employee实例生成空内存.它这样做并产生对该内存的引用.
第三,如果这是我们第一次看到Employee和Employee有一个静态构造函数,那么静态构造函数就会运行.
第四,静态ctor完成后,Employee的字段初始化程序运行.
第五,Employee的基类构造函数运行.这可能会导致其他静态构造函数执行.
第六,Employee的构造函数体.
第七,构造函数完成,并将对now-initialized对象的引用复制到其存储中.
所有这一切当然都假设一路走来都没有引发异常.
4上述陈述与之有什么区别
Employee emp;?告诉内存分配.
该问题没有足够的信息来提供准确的答案.如果从未使用局部变量,则编译器可以自由地对其进行优化.如果它没有优化它,那么存储for emp将从短期池中分配,初始化为null,并且从未使用过.
你应该看到:Stack是一个实现细节,第一部分和第二部分作者:Eric Lippert
1 - 对象emp存储在内存中,即堆栈或堆中,如何?
在堆上,因为它的引用类型Employee 是一个类.
2 - 名称和年龄变量存储在内存中的位置如何?
它们也存储在堆上.虽然age是值类型,但值类型存储在存储容器引用的位置.
3 - 这个陈述中的每个单词做了什么,即员工做了什么......然后再...然后新...然后雇员..然后()..然后;
创建一个Employee名为的新类实例emp
4-上述声明与Employee emp有何区别; ?告诉内存分配.?
Employee emp;意味着只是声明,而不是实例化.这意味着没有内存分配给对象,它将保持null.
| 归档时间: |
|
| 查看次数: |
16040 次 |
| 最近记录: |