将一个类标记为静态的二进制破坏变化?

时间:2014-12-10 11:26:16

标签: c# static static-class

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

我已经比较了两者的IL,除了丢失默认构造函数(永远不应该使用)之外,我可以看到以下差异......

未标记为静态的类:

.class public auto ansi beforefieldinit MyNamespace.MyClass

标记为静态的类:

.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass

我无法理解为什么这会是一个突破性的变化,但是......?

3 个答案:

答案 0 :(得分:3)

这取决于其他代码对您的类的使用情况:static类的潜在用法比非静态类的限制要多得多。

  • 如果该类已被用作static,即使它当时没有静态,代码也不会中断。
  • 如果类已被用作非静态类,即已被继承或实例化,则更改正在中断。

由于一般情况下你无法保证以某种方式使用非静态类,因此将以前的非静态类视为静态类应该被认为是一个重大变化。如果您的控件之外的代码依赖于您的类,请将旧类指定为过时,并使用新的静态类来代替它。

答案 1 :(得分:2)

是的,这是一个重大改变。如果您的图书馆的消费者已经将您的课程子类化,那么它将被破坏。

鉴于该类只包含一堆静态方法,继承它是没有意义的,但如果有人这样做,那将阻止他们的代码编译。

另请注意,您甚至无法声明属于静态类的字段。如果消费者有一个字段,财产或类型的东西,那也会破坏。

所以答案取决于消费者库如何使用它。

答案 2 :(得分:2)

正如您所看到的,为static添加了两个修饰符:

抽象:意味着您无法实例化

密封:意味着您无法继承

因此,如果您要实例化此类,或者您的类型继承自该类,那么在您的代码中,您的代码将被破坏。