// OK
struct MyStruct
{
static void Foo() { }
}
// Error
static struct MyStruct
{
}
答案 0 :(得分:39)
由于您无法创建静态类型的实例,static struct
的行为将与static class
的行为完全相同。因此,没有理由创建它们。我认为理论上可能会有一个static struct
,但这会让人感到困惑 - 如果两者的行为完全,你会如何在static class
和static struct
之间做出选择? em>一样吗?
请注意,结构中的static
方法非常有用,因为您可以将它们用于与结构相关的操作,例如DateTime.TryParse
等。
从技术上讲我不认为当前的C#编译器&运行时可以产生类似static struct
的内容,因为内部(在IL级别)static class
是一个标记为abstract
和sealed
的类。我想你不能创建一个struct
abstract
和sealed
(在IL中)。
答案 1 :(得分:13)
我认为关键是,结构是值类型,而不是引用类型。这就像是说“我的整个程序只有int
的一个实例。它可以有不同的值,但一次只能有一个。”此外,每当您将结构作为参数传递时,它都会通过值传递,也就是说,结构的副本会被创建并放置在堆栈中。这违背了静态定义的目的 - 这应该意味着只有(永远)一个事物被定义的实例。如果你想要创建的是一个Singleton,那么一个类是一个更好的方法来处理它,因为它具有比结构更好的创建语义。
答案 2 :(得分:5)
这里的关键点是类上的static修饰符强制(除其他外)无法创建类的实例。这是通过强制私有构造函数来完成的。
CLR没有任何方法可以阻止创建结构类型的实例。即使没有公共默认构造函数,只需声明
即可struct S { }
S[] items = new S[]{1};
将创建一个struct的实例,并将所有相关的内存设置为零位。
请注意,这与引用类型(类)不同,其中相同的代码将创建指定类型的引用(引用没有对象也称为null)但不是对象本身的实例