首先,如果听起来太愚蠢,我道歉.但我总是发现自己提出以下问题.
由于对象类是.Net中所有类的最终基类,而类是引用类型,引用类型存储在堆上,因此甚至可以进入堆栈.我知道原始类型存储在堆栈中,这就是我感到困惑的地方.
以int32为例,如果它的一个类及其基类是object,那么它的引用类型应该在堆上.怎么去堆叠.
如果它不是一个类,那么我们怎么能这样做
int i = 1;
object obj = i;
Run Code Online (Sandbox Code Playgroud)
既然我做不了类似的事情
int i = 1;
MyClass myObj = i;
Run Code Online (Sandbox Code Playgroud)
编辑
从我得到的答案来看,int是结构而不是类.仍然令人困惑的是值类型的基类是如何引用类型(对象)而它的值类型不是引用类型.
另一点是"属于类的值类型不会存储在堆栈中",我想一切都在类中,甚至是控制台程序中的Main方法.对我来说,这意味着所有变量都以某种方式属于一个类?那他们怎么去堆叠?
Eri*_*ert 14
首先,如果听起来太愚蠢,我道歉.但我总是发现自己提出以下问题.
这些是非常常见的问题.
由于对象类是.Net中所有类的最终基类,而类是引用类型,引用类型存储在堆上,因此甚至可以进入堆栈.
你很困惑很多事情.让我们从:
好的,现在我们知道有三种东西,其中两种是价值观.
现在让我们正确陈述你的句子:
对象类是.NET中所有类的最终基类.类的所有实例都是引用类型的实例.引用类型的所有实例都存储在堆上.如何存储在堆栈中?
现在我们正确地提出了问题,答案很明确. 值类型的引用和实例可以进入堆栈.
让我们继续.
我知道原始类型存储在堆栈中,这就是我感到困惑的地方.
从你的词汇中消除"原始类型"这个词; 这毫无意义.让我们改写一下:
我知道值类型的实例存储在堆栈中
不,你不知道,因为为了算作知识,陈述必须是真的.那句话是错误的.值存储在变量中.变量要么是长寿命的,要么是短命的.短期变量在堆栈上.长期存在的变量在堆上.
以int32为例,如果它的一个类及其基类是object,那么它的引用类型应该在堆上.
Int32不是一个类.这是一个结构.它不是参考类型.
仍然令人困惑的是值类型的基类是如何引用类型(对象)而它的值类型不是引用类型.
玛丽是个母亲.她是女性.她的孩子也都是女性吗?
怎么去堆叠.
当整数存储在短期变量中时,整数在堆栈上.
当引用存储在短期变量中时,引用将进入堆栈.
值是引用还是值类型的实例是无关紧要的; 重要的是变量存在多长时间?
如果它不是一个类,那么我们怎么能这样做
int i = 1;
object obj = i;
Run Code Online (Sandbox Code Playgroud)
好问题.生成一个特殊类.认为这是:
class BoxedInt
{
int value;
public BoxedInt(int v) { this.value = v; }
public int Unbox() { return this.value; }
}
Run Code Online (Sandbox Code Playgroud)
那么你的程序片段是:
int i = 1;
object obj = new BoxedInt(i);
Run Code Online (Sandbox Code Playgroud)
然后
int j = (int)obj;
Run Code Online (Sandbox Code Playgroud)
是相同的
int j = ((BoxedInt)obj).Unbox();
Run Code Online (Sandbox Code Playgroud)
另一点是"属于类的值类型不会存储在堆栈中
更好的说法是:引用类型的字段是长期存在的变量.因此它们存储在堆上.
我想一切都在一个类中,甚至是控制台程序中的Main方法.
是的,所有代码都在类或结构中.
对我来说,这意味着所有变量都以某种方式属于一个类?
不,局部变量不是类的成员.
我住在一个黄色的房子里.因此里面的所有物体都是黄色的吗?
那他们怎么去堆叠?
普通方法中的局部变量是短暂的,因此它会进入堆栈.
只需停止将堆栈视为与存储的数据类型有关. 堆栈与存储什么类型的数据无关. 想想变量.堆栈是短期变量的地方.堆是长寿命变量的地方.变量的类型无关紧要.