对象类原语类型堆栈和堆

Zed*_*Bee 6 .net c#

首先,如果听起来太愚蠢,我道歉.但我总是发现自己提出以下问题.

由于对象类是.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中所有类的最终基类,而类是引用类型,引用类型存储在堆上,因此甚至可以进入堆栈.

你很困惑很多事情.让我们从:

  • 值类型的实例是值.
  • 参考是一个值.
  • 引用是指引用类型实例.(或者它是null,在这种情况下它什么都没引用.)

好的,现在我们知道有三种东西,其中两种是价值观.

现在让我们正确陈述你的句子:

对象类是.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方法.

是的,所有代码都在类或结构中.

对我来说,这意味着所有变量都以某种方式属于一个类?

不,局部变量不是类的成员.

我住在一个黄色的房子里.因此里面的所有物体都是黄色的吗?

那他们怎么去堆叠?

普通方法中的局部变量是短暂的,因此它会进入堆栈.

只需停止将堆栈视为与存储的数据类型有关. 堆栈与存储什么类型的数据无关. 想想变量.堆栈是短期变量的地方.堆是长寿命变量的地方.变量的类型无关紧要.