静态类是引用类型还是值类型?如果有人给出一个很好的解释,那将非常有帮助
6 回答
类始终是引用类型,无论它是静态的还是非静态的。
值和引用类型是关于类型的实例。无法实例化静态类,因此这个问题与静态类无关。
静态类只能包含静态成员,并且静态成员(如属性)为整个应用程序创建一次,因此如果您更改其值,它会在您的应用程序中随处更改。
我认为您所指的是静态类的成员。reference
如果它们实际上是对象,它们就是类型,否则它们只是值类型。据我所知,一个静态类本身不能被传递。尝试运行此代码
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
编辑:-
如果你再深入一点,静态类基本上是一个具有私有构造函数并且没有与之关联的状态(变量)的类(与我提供的示例不同) . 所以理论上是的,它是一种reference
类型
我只想补充一点,静态类既是类又是类型。静态构造函数被调用一次,因此当第一次在程序中“引用”时,它由 CLR 作为类型“创建”,因此是真正的类引用类型。
但我喜欢将静态类的实现或“使用”仅视为空类型或“类名”,因为这实际上是访问其成员的方式和执行方式。因此,将创建的静态类视为仅指向其方法和属性的空指针,而不是像真正的非静态类那样指向包含这些内容的真实实例化类对象的指针。
是的,静态类被视为引用类型,因为当您在方法中更改 StaticClass.Property 值时,此更改将在您引用此类的任何地方填充。它只有一个内存地址,不能被复制,所以当另一个方法或属性调用发生时,这个新值将优先于旧值。
不是它们,因为您不能将其复制为值类型,也不能将其实例化为引用类型。这个问题没有意义,但它确实像structs、int、double一样驻留在堆栈上,但它不允许你被复制!