Ali*_*sad 39 .net c# heap stack static
我正在尝试学习C#如何管理内存.我坚持使用静态元素,我阅读了很多关于这个主题的博客和文章,但我找不到一个相当令人满意的答案.
让我们定义一个代码块来帮助找到答案.
class myClass
{
static string myStr = "String Data";
static int myInt = 12;
}
Run Code Online (Sandbox Code Playgroud)
在你们分享你的答案之前,让我分享一下我对这个主题的了解.随意同意或不同意,并帮助我找到正确的答案.
让我感到困惑的是,我在互联网上找到的关于这个主题的一些答案.
混乱1号:
程序启动时,会将所有相关程序集加载到AppDomain中.加载程序集时,将调用所有静态构造函数,包括静态字段.他们将住在那里,卸载它们的唯一方法是卸载AppDomain.
在上面的行中,明确提到存储在AppDomain上的所有静态元素.那么为什么互联网上的每个人都说"静态"元素存储在堆/堆栈上?
困惑2:
每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明.
如果每个静态变量都存储在堆上.那么为什么有些人说值类型静态变量存储在堆栈上?
请帮助我连接点以了解C#中静态变量的内存管理.非常感谢你宝贵的时间:)
Lua*_*aan 57
首先,请注意所有这些都是实现细节.运行时唯一保证的是:
这就是它.其他一切都是一个实现细节 - 规范不关心堆栈,堆或其他任何东西.这取决于运行时的实现,并且有效的运行时可以将所有内容放在堆栈上(如果需要的话)或堆上.不要忘记寄存器.
现在,让我们看看你已经设法提出的一些误解:
TypeLoadException
,最有可能在一个首先引用该类型的方法中(不用说,这会使调试静态变得棘手).有些人可能会感到困惑.有些人不理解合同和实际实施之间的区别.有些人根本不知道他们在谈论什么.我希望有一个简单的方法可以知道哪个是哪个,但没有.如果有疑问,您可以转到C#/ CLR规范,但这只会告诉您合同,而不是实际情况.
托管内存的重点在于您不应该关心这些实现细节.当然,就像任何抽象一样,它会泄漏 - 通过所有不同的层和抽象来了解事物的真实情况,直到CPU微指令,内存缓存等.但是没有什么可以依赖的 - 实施可以随时改变,而且过去有很多次.
归档时间: |
|
查看次数: |
15021 次 |
最近记录: |