2

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

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

未标记为静态的类:

.class public auto ansi beforefieldinit MyNamespace.MyClass

标记为静态的类:

.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass

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

4

3 回答 3

3

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

  • 如果该类已被使用,static即使它当时还不是静态的,代码也不会中断。
  • 如果该类已像非静态类一样使用,即已被继承或实例化,则更改将中断。

由于通常您不能保证以某种方式使用您的非静态类,因此将以前的非静态类设为静态类应该被视为一项重大更改。如果您有超出您控制范围的代码依赖于您的类,请指定旧类已过时,并使用新的静态类代替它。

于 2014-12-10T11:32:41.483 回答
2

是的,这是一个突破性的变化。如果你的图书馆的消费者已经继承了你的类,它就会被破坏。

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

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

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

于 2014-12-10T11:28:58.913 回答
2

如您所见,添加了两个修饰符static

abstract:意味着你不能实例化它

密封:意味着你不能继承它

所以在你的代码中,如果你正在实例化这个类或者你有一个继承自它的类型,你的代码将会被破坏。

于 2014-12-10T11:30:43.590 回答