相关疑难解决方法(0)

静态类和单例模式之间的区别?

静态类和单例模式之间存在什么真实(即实际)差异?

两者都可以在没有实例化的情况下调用,两者都只提供一个"实例",它们都不是线程安全的.还有其他区别吗?

singleton static design-patterns

1708
推荐指数
21
解决办法
48万
查看次数

函数调用后,“静态”值似乎已重置

我找到了很多有关静态的文章(MSDNMSDN 2Stack 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

foo = 1,value = -7

但是,下一步value-1

值= -1

我希望-8因为静态字段存储在内存中一次。

当我将其更改为

var x = foo();
value -= x;
Run Code Online (Sandbox Code Playgroud)

表明 -8

究竟如何运作?

c#

88
推荐指数
6
解决办法
9223
查看次数

所有静态成员都存储在哪里?

我正在尝试学习C#如何管理内存.我坚持使用静态元素,我阅读了很多关于这个主题的博客和文章,但我找不到一个相当令人满意的答案.

让我们定义一个代码块来帮助找到答案.

class myClass
{
    static string myStr = "String Data";
    static int myInt = 12;
}
Run Code Online (Sandbox Code Playgroud)

在你们分享你的答案之前,让我分享一下我对这个主题的了解.随意同意或不同意,并帮助我找到正确的答案.

  • 静态只是一生.
  • 静态引用类型(myStr)将在堆上运行一生.
  • 静态值类型(myInt)将在堆栈中持续一生.

让我感到困惑的是,我在互联网上找到的关于这个主题的一些答案.

混乱1号:

程序启动时,会将所有相关程序集加载到AppDomain中.加载程序集时,将调用所有静态构造函数,包括静态字段.他们将住在那里,卸载它们的唯一方法是卸载AppDomain.

在上面的行中,明确提到存储在AppDomain上的所有静态元素.那么为什么互联网上的每个人都说"静态"元素存储在堆/堆栈上?

困惑2:

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明.

如果每个静态变量都存储在堆上.那么为什么有些人说值类型静态变量存储在堆栈上?

请帮助我连接点以了解C#中静态变量的内存管理.非常感谢你宝贵的时间:)

.net c# heap stack static

39
推荐指数
2
解决办法
2万
查看次数

Java:静态字段存在于内存中的哪个位置?

如果我们将对象存储在对象的静态字段中,JVM如何为它分配内存?它是否存在于"隐含"(不确定我是否使用正确的单词)类对象中?静态字段与对象字段有何不同?

java static class

17
推荐指数
2
解决办法
6568
查看次数

在哪里为静态,常量和只读字段分配内存?

我已经在程序中使用了这三个字段,并在用法上有所不同,但是我对这些字段存储在何处感到有点困惑?在数据段(堆栈还是堆?)或代码段中?

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

c# static constants readonly

5
推荐指数
1
解决办法
217
查看次数

什么时候和谁创建静态类的实例?

最近我在面试中被问到一个问题.

采访者问下面的问题

- 什么时候和谁创建静态类的实例?清楚地创建实例意味着在内存中分配空间.如果不在内存中分配空间,我们就无法调用方法.

我很困惑因为根据我的知识,静态类不会创建实例所以我在互联网上搜索,我发现只有一次实例创建静态类,这是第一次调用第一个静态方法时.这是对的吗?

创建实例的第二个问题是什么?这是CLR吗?

c#

0
推荐指数
1
解决办法
100
查看次数

标签 统计

c# ×4

static ×4

.net ×1

class ×1

constants ×1

design-patterns ×1

heap ×1

java ×1

readonly ×1

singleton ×1

stack ×1