如何访问和修改静态值类型字段?



我注意到值类型的静态字段存储在堆上而没有装箱。

对于实例/非静态值类型字段,我知道它们被视为堆上对象(包含字段)的一部分,以便在相关方法调用期间将该对象的引用复制到堆栈帧。

但是由于静态值类型字段不与类的特定实例相关联,我可以问一下堆上的静态值类型字段是如何在堆栈框架中访问和修改的吗?

举个简单的例子:

class TrialsOnB
{
    public static int _b = 0;
    public int AccessB()
    {
        return _b;
    }
    public void ModifyB(int x)
    {
        _b = x;
    }
}

从重复链接下接受的答案来看,我目前的理解是,在c#和Java中,所有(各种)静态字段都存储在类的Type对象中。因此,如果存在堆栈帧,并且其中的数据引用了静态字段,那么它可能会复制Type对象的引用并进行操作。

如果我的理解不正确,有人可以纠正我吗?多谢

可以修改。但是,使静态变量独特的是静态变量属于类而不是特定的对象。

我们可以为一个类创建任意数量的对象。这些对象将有它们自己的复制实例变量。但是对于跨所有对象的静态变量,只有一个静态变量副本可用。如果一个对象改变了静态变量的值,它也会反映在其他对象中。

也可以访问静态变量,而不必为该类创建对象。静态变量是类加载时首先加载到内存中的变量。

当类型第一次被引用时,静态变量存储在托管堆中,而不是堆栈中。编译类的Type Object包含对该对象的引用。

类的Type Object将一直留在内存中,直到它所在的AppDomain被卸载。因为堆上的对象总是被编译后的类型对象引用,所以堆上的静态对象永远不会被GC'ed,并且总是消耗内存,直到AppDomain被卸载

请参阅

相关内容

  • 没有找到相关文章

最新更新