- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
首先,如果听起来太蠢,我深表歉意。但我总是发现自己在问以下问题。
由于对象类是 .Net 中所有类的最终基类,而类是引用类型,因此引用类型存储在堆上,所以任何东西都如何进入堆栈。我知道原始类型存储在堆栈中,这就是我感到困惑的地方。
以int32为例,如果它是一个类,它的基类是object,那么它是一个引用类型,应该在堆上。它如何进入堆栈。
如果它不是一个类,那我们该怎么做
int i = 1;
object obj = i;
因为我不能做类似的事情
int i = 1;
MyClass myObj = i;
编辑
从我得到的答案来看,int 是结构而不是类。仍然令人困惑的是值类型的基类是引用类型(对象),而它的值类型不是引用类型。
出现的另一点是“属于类的值类型不会存储在堆栈中”,我想一切都在类中,甚至是控制台程序中的 Main 方法。对我来说,这意味着所有变量都以某种方式属于一个类?那么它们如何堆叠?
最佳答案
First of all I apologize if it sounds too dumb. but I always find myself asking the following questions.
这些都是很常见的问题。
Since object class is the ultimate base class for all classes in .Net and class is a reference type, reference types are stored on heap so how did anything even get to the stack.
你混淆了很多东西。让我们开始:
OK,现在我们知道有三种东西,其中两种是值。
现在让我们正确地说出你的句子:
The object class is the ultimate base class for all classes in .NET. All instances of classes are instances of reference types. All instances of reference types are stored on heap. How is anything stored on the stack?
既然我们的问题措辞正确,答案就很清楚了。 引用和值类型的实例可以进入堆栈。
让我们继续。
I know primitive types get stored on stack and that's where I get confused.
从你的词汇表中消除“原始类型”这个词;这是没有意义的。让我们换个说法:
I know that instances of value types get stored on stack
不,您不知道知道,因为要算作知识,陈述必须是真实的。这种说法是错误的。值存储在变量中。变量要么是长生命周期的,要么是短生命周期的。短期变量进入堆栈。长生命周期变量进入堆。
Take int32 for instance, if its a class and its base class is object, then its a reference type, should be on heap.
Int32 不是一个类。这是一个结构。它不是引用类型。
Still the confusion is how a value type's base class is a reference type (object) and its a value type not a reference type.
玛丽是一位母亲。她是女性。因此,她所有的 child 都是女性吗?
How does it go to stack.
当整数存储在短期变量中时,该整数进入堆栈。
当引用存储在短期变量中时,引用进入堆栈。
值是引用还是值类型的实例无关紧要;重要的是变量存活多长时间?
If its not a class then how can we do this
int i = 1;
object obj = i;
好问题。生成一个特殊的类。将其视为:
class BoxedInt
{
int value;
public BoxedInt(int v) { this.value = v; }
public int Unbox() { return this.value; }
}
那么你的程序片段是:
int i = 1;
object obj = new BoxedInt(i);
然后
int j = (int)obj;
与
相同int j = ((BoxedInt)obj).Unbox();
Another point that came up is that "value-types that belong to a class do not get stored on the stack
更好的说法是:引用类型的字段是长生命周期变量。因此它们存储在堆上。
I guess everything is inside a class, even the Main method inside a console Program.
是的,所有代码都在类或结构中。
For me that means all the variable somehow belong to a class?
不,局部变量不是类的成员。
我住在黄色的房子里。里面的东西是不是也都是黄色的?
So How do they go to stack?
普通方法中的局部变量是短暂的,所以它进入堆栈。
只需停止将堆栈视为与存储的数据类型有关的想法。 堆栈与存储的数据类型无关。想想变量。栈是短期变量的地方。堆是存放长生命周期变量的地方。变量的类型无关紧要。
关于c# - 对象类原始类型堆栈和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21520774/
出于好奇 - 我知道有 LAMP - Linux、Apache、MySQL 和 PHP。但是还有哪些其他 Web 堆栈替代方案的缩写呢?像 LAMR - Linux、Apache、MySQL Ruby
我有以下代码。 var stackMapIn = []; var stackMapOut = []; var stackBack = []; stackMapOut.push("m1"); $scop
我遇到了导致我的堆栈无法恢复的情况,我别无选择,只能将其删除。使用完全相同的模板,我继续创建了另一个同名的堆栈。 The following resource(s) failed to create:
这是我第一次查看 Node 堆栈,自从我学习使用 Ruby on Rails 进行 Web 开发以来,我对一些基本的东西有点困惑。我了解 Rails 目录是什么样的。 demo/ ..../app .
本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题。分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: ?
我正在按照指南 here ,它告诉我: The stack setup will download the compiler if necessary in an isolatedlocation (
同时 trying to debug a different question ,我安装了一个似乎与我安装的其他一些软件包冲突的软件包。 我跑了 $ stack install regex-pcre-
我花了几个小时创建了一个方法,该方法将从堆栈 s1 中获取 null 元素,并将它们放入 s2 中。然后该类应该打印堆栈。方法如下 import net.datastructures.ArraySta
我有一个类Floor,它有一个Stack block ,但我不知道如何初始化它。我曾尝试过这样的: public class Floor { private Stack stack;
我知道这个问题已经问过很多次了,但搜索一个小时后我仍然遇到问题。 我想使用一个 lifo 堆栈,它可以存储最大数量的元素。达到最大数量后,首先删除该元素并将其替换为新元素,这样在第一次弹出时我可以获取
我需要编写一个方法,压缩以执行以下操作; 目标compress方法是从栈s1中移除所有null元素。剩余(非空)元素应按其初始顺序保留在 s1 上。辅助堆栈 s2 应用作s1 中元素的临时存储。在该方
我正在尝试验证以下代码发生的顺序。 function square(n) { return n * n; } setTimeout(function(){ console.log("H
我需要一个字符数组,其中包含基于特定文件夹中文件数量的动态数量的字符数组。我能够通过初始化 char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH
我正在编写一些日志逻辑并想要进行一些缩进。了解是否存在任何函数调用或某个函数是否已完成的最简单方法是查看堆栈/帧的当前地址。让我们假设堆栈颠倒增长。然后,如果 log() 调用中的堆栈地址小于前一次调
所以内存分段在x86-64中被放弃了,但是当我们使用汇编时,我们可以在代码中指定.code和.data段/段,并且还有堆栈指针寄存器。 还有堆栈段、数据段和代码段寄存器。 代码/数据/堆栈的划分是如何
void main() { int x = 5; // stack-allocated Console.WriteLine(x); } 我知道 x 是堆栈分配的。但是关于 x 的堆栈中
这是我关于 SO 的第一个问题。这可能是一个愚蠢的问题,但到目前为止我还没弄明白。 考虑下面的程序 Reader.java: public class Reader { public
java中有没有一种快速的方法来获取嵌套/递归级别? 我正在编写一个函数来创建组及其成员的列表。成员也可以是团体。我们最终可能会得到一组循环的组/成员。 我想在某个任意级别停止。 我知道我可以将变量保
考虑以下代码: struct A{...}; A a[100]; A* pa = new A[100]; delete[] pa; a/pa 元素的销毁顺序是由标准定义的还是实现定义的(对于第二种情况
我在下面有一些代码。此代码是一个基本的压入/弹出堆栈类,我将其创建为模板以允许某人压入/弹出堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。 所以我希望能够创建一个基本上可以发送三个整
我是一名优秀的程序员,十分优秀!