// OK
struct MyStruct
{
static void Foo() { }
}
// Error
static struct MyStruct
{
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 40
由于您无法创建静态类型的实例,因此行为static struct将与行为完全相同static class.因此,没有理由创建它们.我认为这将是理论上可能有一个static struct,但它会是混乱-你会如何选择static class和static struct若两者的行为是完全相同的一样吗?
请注意,staticstruct中的方法非常有用,因为您可以将它们用于与struct相关的操作,例如DateTime.TryParse等.
从技术上讲,我不认为当前的C#编译器和运行时可能产生类似a的东西static struct,因为内部(在IL级别)static class是一个标记为abstract和的类sealed.而且我想你不能创建struct,这将是abstract与sealed(在IL).
tva*_*son 15
我认为关键是,struct是值类型,而不是引用类型.这就像是说" int我的整个程序只有一个实例.它可以有不同的值,但一次只能有一个." 此外,每当您将结构作为参数传递时,它都会通过值传递,也就是说,结构的副本会被创建并放置在堆栈中.这违背了静态定义的目的 - 这应该意味着只有(永远)一个事物被定义的实例.如果你想要创建的是一个Singleton,那么一个类是一个更好的方法来处理它,因为它具有比结构更好的创建语义.
yel*_*ar 6
这里的关键点是,类上的static修饰符强制(除其他事项外)不能创建该类的实例。这是通过强制使用私有构造函数来完成的。
CLR没有任何方法可以防止创建结构类型的实例。即使没有公共默认构造函数,也只需声明
struct S { }
S[] items = new S[]{1};
Run Code Online (Sandbox Code Playgroud)
将创建一个结构实例,并将所有关联的内存设置为零位。
注意,这是从参考类型(类),其中,相同的代码将创建不同的参考的特定类型(参照没有对象又名空),但不是该对象本身的一个实例。