我有一个只包含静态方法的实用程序类。如果我将该类标记为静态,那么这是一个破坏性的二进制更改吗?
我已经比较了两者的IL,除了丢失默认构造函数(永远不应该使用)之外,我可以看到以下差异......
未标记为静态的类:
.class public auto ansi beforefieldinit MyNamespace.MyClass
标记为静态的类:
.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass
我无法理解为什么这会是一个突破性的变化,但是......?
答案 0 :(得分:3)
这取决于其他代码对您的类的使用情况:static
类的潜在用法比非静态类的限制要多得多。
static
,即使它当时没有静态,代码也不会中断。由于一般情况下你无法保证以某种方式使用非静态类,因此将以前的非静态类视为静态类应该被认为是一个重大变化。如果您的控件之外的代码依赖于您的类,请将旧类指定为过时,并使用新的静态类来代替它。
答案 1 :(得分:2)
是的,这是一个重大改变。如果您的图书馆的消费者已经将您的课程子类化,那么它将被破坏。
鉴于该类只包含一堆静态方法,继承它是没有意义的,但如果有人这样做,那将阻止他们的代码编译。
另请注意,您甚至无法声明属于静态类的字段。如果消费者有一个字段,财产或类型的东西,那也会破坏。
所以答案取决于消费者库如何使用它。
答案 2 :(得分:2)
正如您所看到的,为static
添加了两个修饰符:
抽象:意味着您无法实例化
密封:意味着您无法继承
因此,如果您要实例化此类,或者您的类型继承自该类,那么在您的代码中,您的代码将被破坏。