【问题标题】:Is marking a class as static a binary breaking change?将类标记为静态是二进制重大更改吗?
【发布时间】:2014-12-10 11:26:15
【问题描述】:

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

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

类未标记为静态:

.class public auto ansi beforefieldinit MyNamespace.MyClass

类标记为静态:

.class public auto ansi abstract sealed beforefieldinit MyNamespace.MyClass

我不明白为什么这会是一个重大变化,但是...?

【问题讨论】:

  • 如果有人从 MyNamespace.MyClass 继承或直接创建了它的实例,那么它将被破坏
  • @TrevorPilley:我没想到客户会使用函数继承——我只是想通过类名调用普通的静态方法是否会被破坏——但这仍然是一个很好的观点.谢谢。

标签: c# static static-class


【解决方案1】:

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

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

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

【讨论】:

  • 这是回答我意思最好问的答案(如果该类像静态一样使用),但所有其他点都是完全有效的 - 谢谢。跨度>
【解决方案2】:

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

抽象:表示你不能实例化它

密封:表示你不能继承它

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

【讨论】:

  • 我会用所有的答案来默认静态方法上的正常调用会很好(我的问题应该更清楚),但这是最清楚的答案 - 谢谢。跨度>
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2019-01-28
    • 2014-01-23
    • 2010-09-13
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多