静态类是引用类型还是值类型?

5
静态类是引用类型还是值类型?如果有人能给出一个好的解释,那将非常有帮助。
6个回答

15

无论类是静态的还是非静态的,它始终是引用类型。


5
在此情况下,一个静态类“不在内存中”,因为它不能被实例化,所以实际上无法持有对它的引用。如果您不能合理地拥有该类型的变量,则这一点几乎没有意义。 - TomTom
@Steven,你根本不知道你在说什么! - Lecha Bisultanov

2

值类型和引用类型是关于类型的实例。静态类无法实例化,因此这个问题与静态类无关。

静态类只能包含静态成员,静态成员(如属性)仅在整个应用程序中创建一次,因此如果更改其值,则会在应用程序中的所有位置都发生更改。


1
我只想补充一点,静态类既是一个类又是一种类型。静态构造函数只会被调用一次,因此在程序中第一次“引用”时,CLR会将其“创建”为一种类型,因此它是一个真正的类引用类型。
但是,我认为静态类的实现或者说“使用”更像是一个空类型或者仅仅是“类名”,因为这确实是访问它的成员和执行它的方式。因此,将创建的静态类视为指向其方法和属性的空指针,而不是指向包含这些内容的真正实例化类对象的指针,就可以了解它的运行方式。

1
我认为你所指的是静态类的成员。如果它们实际上是对象,那么它们就是引用类型,否则它们只是值类型。 据我所知,静态类本身无法传递。 尝试运行这段代码。
class Program
    {
        static void Main(string[] args)
        {
            StaticClass.x = 89;
            Console.WriteLine(StaticClass.x);
            changeValue(StaticClass.x);
            Console.WriteLine(StaticClass.x);
            Console.ReadKey();
        }
        static void changeValue(int x)
        {
            x = x + 1;
        }
    }
{
    public static class StaticClass
    {
        public static int x { get; set; }
    }
}

编辑:-
在这两种情况下,输出都是89。
编辑:-
如果你深入挖掘一下,一个静态类基本上是一个带有私有构造函数和没有与之关联的状态(变量)的类(不像我提供的例子)。所以理论上它是一个引用类型


0

没有一个,因为你不能将它作为值类型复制,也不能将其实例化为引用类型。这个问题没有意义,但它确实像结构体、int、double一样存在于堆栈上,但它不允许被复制!


0

是的,静态类被视为引用类型,因为当您在方法中更改StaticClass.Property值时,此更改将在引用此类的任何地方传播。它只有一个内存地址,不能被复制,因此当发生另一个方法或属性调用时,新值将优先于旧值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接