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 に答える