C# 将一个类标记为静态类是一种二进制破坏性更改吗?

C# 将一个类标记为静态类是一种二进制破坏性更改吗?,c#,static,static-class,C#,Static,Static Class,我有一个只包含静态方法的实用程序类。如果我将类标记为static,这是一个破坏性的二进制更改吗 我比较了两者的IL,除了默认构造函数的丢失(不应该使用),我可以看到以下区别 未标记为静态的类: .class public auto ansi beforefieldinit MyNamespace.MyClass .class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass 标记为静态的类: .class

我有一个只包含静态方法的实用程序类。如果我将类标记为static,这是一个破坏性的二进制更改吗

我比较了两者的IL,除了默认构造函数的丢失(不应该使用),我可以看到以下区别

未标记为静态的类:

.class public auto ansi beforefieldinit MyNamespace.MyClass
.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass
标记为静态的类:

.class public auto ansi beforefieldinit MyNamespace.MyClass
.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass

我不明白为什么这会是一个突破性的变化,但是…?

是的,这是一个突破性的变化。如果库的使用者对类进行了子类化,则该类将被破坏

假设这个类只包含一堆静态方法,那么继承它是没有意义的,但是如果有人这样做了,就会停止编译他们的代码

还要注意,您甚至不能声明静态类类型的字段。如果消费者有一个字段、属性或您的类型的东西,这也会中断

因此,答案取决于消费者图书馆如何使用它

如您所见,为
静态
添加了两个修饰符:

摘要:表示无法实例化它

密封的:表示您不能从中继承


因此,在您的代码中,如果您正在实例化这个类,或者您有一个继承自它的类型,那么您的代码将被破坏。

这取决于其他代码对您的类的使用情况:
静态类的潜在使用比非静态类的潜在使用情况受到更多限制

  • 如果类被像static一样使用,即使它当时不是静态的,代码也不会中断
  • 如果类被像非静态类一样使用,即被继承或实例化,那么更改正在中断

由于通常不能保证以某种方式使用非静态类,因此将以前的非静态类变为静态类应该被视为一个突破性的变化。如果有依赖于您的类的超出您控制范围的代码,请将旧类指定为过时,并创建一个新的静态类来代替它。

如果有人继承了MyNamespace.MyClass或直接创建了它的实例,那么它将breaking@TrevorPilley:我不希望客户端使用函数继承-我只是在考虑是否会破坏通过类名进行的常规静态方法调用-但这是一个非常好的观点。谢谢。我会把所有的答案都默示出来,对静态方法的正常调用是可以的(我的问题应该更清楚),但这是最清楚的答案-谢谢。这是我想问的最好的答案(如果类像静态一样使用),但所有其他的点都是完全有效的-谢谢。