为什么不能在C#中声明静态结构,但是它们可以有静态方法?

时间:2010-04-10 12:36:15

标签: c#

// OK
struct MyStruct
{
    static void Foo() { }
}

// Error
static struct MyStruct
{
}

3 个答案:

答案 0 :(得分:39)

由于您无法创建静态类型的实例,static struct的行为将与static class的行为完全相同。因此,没有理由创建它们。我认为理论上可能会有一个static struct,但这会让人感到困惑 - 如果两者的行为完全,你会如何在static classstatic struct之间做出选择? em>一样吗?

请注意,结构中的static方法非常有用,因为您可以将它们用于与结构相关的操作,例如DateTime.TryParse等。

从技术上讲我不认为当前的C#编译器&运行时可以产生类似static struct的内容,因为内部(在IL级别)static class是一个标记为abstractsealed的类。我想你不能创建一个struct abstractsealed(在IL中)。

答案 1 :(得分:13)

我认为关键是,结构是值类型,而不是引用类型。这就像是说“我的整个程序只有int的一个实例。它可以有不同的值,但一次只能有一个。”此外,每当您将结构作为参数传递时,它都会通过值传递,也就是说,结构的副本会被创建并放置在堆栈中。这违背了静态定义的目的 - 这应该意味着只有(永远)一个事物被定义的实例。如果你想要创建的是一个Singleton,那么一个类是一个更好的方法来处理它,因为它具有比结构更好的创建语义。

答案 2 :(得分:5)

这里的关键点是类上的static修饰符强制(除其他外)无法创建类的实例。这是通过强制私有构造函数来完成的。

CLR没有任何方法可以阻止创建结构类型的实例。即使没有公共默认构造函数,只需声明

即可
struct S { }

S[] items = new S[]{1};

将创建一个struct的实例,并将所有相关的内存设置为零位。

请注意,这与引用类型(类)不同,其中相同的代码将创建指定类型的引用(引用没有对象也称为null)但不是对象本身的实例