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

sfe*_*982 35 c#

// 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 classstatic struct若两者的行为是完全相同的一样吗?

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

从技术上讲,我不认为当前的C#编译器和运行时可能产生类似a的东西static struct,因为内部(在IL级别)static class是一个标记为abstract和的类sealed.而且我想你不能创建struct,这将是abstractsealed(在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)

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

注意,这是从参考类型(类),其中,相同的代码将创建不同的参考的特定类型(参照没有对象又名空),但不是该对象本身的一个实例。