一个具有值类型和引用类型的对象在.NET中如何存储?

3
在.NET中,整数数据类型是值类型(堆栈),而字符串是引用类型(堆)。
如果一个类A有一个整数和一个字符串类型的对象,在其中,类B创建了一个类A的对象,那么这个类A的对象将如何存储在内存中?在堆栈还是在堆中?
这是我在微软面试中被问到的问题。需要了解我的表现如何。

3
熟悉术语“实现细节”。 - Anthony Pegram
1
你能解释一下为什么你关心这个吗?假设我告诉你它被存储在“frob”上,这是一个既不是堆栈也不是堆的特殊存储位置。如果知道了这些,你会做出什么决策呢?你会问哪些关于“frob”本质的后续问题? - Eric Lippert
这是我参加某公司面试时的一个问题,所以我在想我对那里说的话表现如何。Eric,感谢您的精彩文章! - Saurabh Kumar
1
在这方面,考虑一下你所问的背景。他们使用intstring字段来混淆问题,但问题实际上是关于类A的。A作为一个类,是一个引用类型。它的字段并不重要。因此,A类型的对象将根据Microsoft在桌面CLR上实现的方式放在堆上等等。 - Anthony Pegram
4个回答

9

Eric Lippert 刚刚写了这篇文章:

关于使用堆栈还是堆存储的选择与所存储的对象类型本质上没有任何关系,这种说法是错误的。

真正的情况是:

在桌面CLR上的C#的Microsoft实现中,如果值类型是一个局部变量或临时变量,并且不是lambda或匿名方法的闭合局部变量,而且方法体不是迭代器块,并且jitter选择不要将值调入寄存器,则该值类型存储在堆栈上。

最重要的是,他强调你只需要关心某个生命周期内的事物存在于哪里,而不需要关心类型存在于哪里。


3
一般来说,只有作为局部变量的值类型才会存在堆栈中。而其他的,包括类的字段,都存储在堆上。
实际情况更加复杂;请参考Rex M答案中提供的Eric Lippert博客链接。

0
如果我记得正确,无论其成员类型如何,对象始终是引用类型。
因此,任何 Class A 的对象都将存储在堆上。

0

这只是一个棘手的问题。我认为这个问题是问你检查你在dotnet中类的知识。类是引用类型。所以简单来说,它将进入堆部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接