単語invariantは、特定の条件の下で何かが変更されないことを意味しません。不変量にはさまざまな種類があります。例えば、物理学では、光の速度はローレンツ変換の下で不変であり、すなわち、基準フレームに変更すると変化しない。プログラミングでは、多くの種類の不変量もあります。関数の寿命中に変化しないメソッドinvariants、オブジェクトの生涯にわたって変化しないクラス不変量があります。
クラス不変式は、常に公に観察可能なものですそのクラスのインスタンスで真。
これは、共変/逆分散には決して関係しません。共変/差異分散は、異なる(汎用)パラメータまたは戻り値の型を持つ他の型に代わることができる型を記述します。共変/逆変分をサポートしていないので不変なものを呼び出すことができますが、これはクラスやメソッドの不変量とはまったく異なる種類の不変量です。
このクラスでは:
class MyCollection<T>
{
private T[] data;
private int size;
public MyCollection()
{
data=new T[4];
}
public int Size{get{return size;}}
public int Capacity{get{return data.Length;}}
[ContractInvariantMethod]
protected void ClassInvariant()
{
Contract.Invariant(data != null);
Contract.Invariant(Size >= 0);
Contract.Invariant(Capacity >= 0);
Contract.Invariant(Size < Capacity);
}
}
ほぼすべてのクラスには、いくつかの不変条件ではなく、誰もが持っていますそれらを強制する。 .net 4は、コード契約を使用してそれらを文書化し、アサートする良い方法を追加します。
.NETの不変性は他の種類の不変性には関係しません。私は同意しませんが、おそらくそれは私が間違っているところです。多分型不変性は、クラス不変性や単体テストの使用法とは無関係であり、初歩的なレベルにのみ関係していると考えられます。 「不変性」を単に「変化しない」と定義した場合。問題は「変化しないことをどうやってテストするのか」です。または、「有効な値の範囲をどのようにテストしますか」という質問ですか? –
@ P.Brian不変量には多くの種類があります。そして、タイプの分散はクラス不変量とは完全に無関係です。私は入門の段落を追加しました。 – CodesInChaos
@ P.Brian .net 4でクラス不変式を実行する方法を見るには、 "Lee"の答えを参照してください。これを行うと(適切なコンパイラ設定を選択すると)コードは書き換えられ、パブリックメソッドの終わりに不変条件をテストします。 – CodesInChaos