将类标记为静态是否为二进制中断性更改
本文关键字:中断 二进制 是否 记为 静态 | 更新日期: 2023-09-27 18:33:52
我有一个只包含静态方法的实用程序类。如果我将类标记为静态,这是破坏性的二进制更改吗?
我已经比较了两者的 IL,除了丢失默认构造函数(永远不应该使用)之外,我可以看到以下差异......
类未标记为静态:
.class public auto ansi beforefieldinit MyNamespace.MyClass
标记为静态的类:
.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass
我不明白为什么这会是一个重大变化,但是...?
这取决于其他代码对类的使用情况:static
类的潜在使用比非静态类的限制要大得多。
- 如果类像
static
一样使用,即使它当时不是静态的,代码也不会中断。 - 如果该类像非静态类一样使用,即已被继承或实例化,则更改是中断的。
由于通常不能保证以某种方式使用非静态类,因此将以前的非静态类设置为静态类应被视为重大更改。如果控件之外的代码依赖于类,请将旧类指定为过时,并创建一个新的静态类来代替它。
如您所见,为static
添加了两个修饰符:
摘要:表示您无法实例化它
密封:表示您无法从中继承
因此,在您的代码中,如果您正在实例化此类,或者您有一个继承自它的类型,您的代码将被破坏。
是的,这是一个重大更改。如果库的使用者已经子类化了你的类,它将被破坏。
鉴于该类仅包含一堆静态方法,因此继承它是没有意义的,但如果有人这样做,这将阻止他们的代码编译。
另请注意,您甚至不能声明静态类类型的字段。如果消费者有一个字段、属性或你类型的东西,那也会中断。
所以答案取决于消费者库如何使用它。