静态类和单例模式之间存在什么真实(即实际)差异?
两者都可以在没有实例化的情况下调用,两者都只提供一个"实例",它们都不是线程安全的.还有其他区别吗?
我找到了很多有关静态的文章(MSDN,MSDN 2,Stack Overflow等等),但是我仍然不明白为什么此代码返回-1:
class Program
{
static int value = 0;
static int foo()
{
value = value - 7;
return 1;
}
static void Main(string[] args)
{
value -= foo();
Console.WriteLine(value);
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
这是调试器在foo()运行后但从中减去结果之前显示的内容value:
但是,下一步value是-1:
我希望-8因为静态字段存储在内存中一次。
当我将其更改为
var x = foo();
value -= x;
Run Code Online (Sandbox Code Playgroud)
表明 -8
究竟如何运作?
我正在尝试学习C#如何管理内存.我坚持使用静态元素,我阅读了很多关于这个主题的博客和文章,但我找不到一个相当令人满意的答案.
让我们定义一个代码块来帮助找到答案.
class myClass
{
static string myStr = "String Data";
static int myInt = 12;
}
Run Code Online (Sandbox Code Playgroud)
在你们分享你的答案之前,让我分享一下我对这个主题的了解.随意同意或不同意,并帮助我找到正确的答案.
让我感到困惑的是,我在互联网上找到的关于这个主题的一些答案.
混乱1号:
程序启动时,会将所有相关程序集加载到AppDomain中.加载程序集时,将调用所有静态构造函数,包括静态字段.他们将住在那里,卸载它们的唯一方法是卸载AppDomain.
在上面的行中,明确提到存储在AppDomain上的所有静态元素.那么为什么互联网上的每个人都说"静态"元素存储在堆/堆栈上?
困惑2:
每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明.
如果每个静态变量都存储在堆上.那么为什么有些人说值类型静态变量存储在堆栈上?
请帮助我连接点以了解C#中静态变量的内存管理.非常感谢你宝贵的时间:)
如果我们将对象存储在对象的静态字段中,JVM如何为它分配内存?它是否存在于"隐含"(不确定我是否使用正确的单词)类对象中?静态字段与对象字段有何不同?
我已经在程序中使用了这三个字段,并在用法上有所不同,但是我对这些字段存储在何处感到有点困惑?在数据段(堆栈还是堆?)或代码段中?
static int a;
const int b=1235;
readonly int c;
Run Code Online (Sandbox Code Playgroud)
在ILDASM中,字段描述如下
对于静态:.field private静态int32 a
对于常量:.field私有静态文字int32 b = int32(0x000004D3)
对于只读:.field private initonly int32 c
最近我在面试中被问到一个问题.
采访者问下面的问题
- 什么时候和谁创建静态类的实例?清楚地创建实例意味着在内存中分配空间.如果不在内存中分配空间,我们就无法调用方法.
我很困惑因为根据我的知识,静态类不会创建实例所以我在互联网上搜索,我发现只有一次实例创建静态类,这是第一次调用第一个静态方法时.这是对的吗?
创建实例的第二个问题是什么?这是CLR吗?