C#は、C++が提供する(コード契約を無視して)const
の正解をサポートしていませんが、readonly
修飾子(およびC#6.0の真の読み取り専用自動プロパティ)を提供します。 。
C#にはレコードタイプの構文サポートもありませんが、残念ながらC#7から引き出されていますので、もう1年待たなければなりません。
とにかく、.NETの不変型は、作成後に状態を変更できないPOCOだけです。これは、タイプにreadonly
とタグ付けされたすべてのフィールドがあり、すべての複合(つまり非スカラー)メンバーも同様に制約されている場合にのみ、コンパイラまたはランタイムによって適用されることに注意してください。ああ、あなたは配列メンバーを持つことはできません。なぜなら、C#での読み取り専用バッファの強制もないからです。これは、実際には、C#の「不変」型は、消費者(規則に従うことになる(反射がないなど))が、いつ使用するかについてある仮定を行うことができる、うまく設計されたPOCOであることを意味します。不変型は本質的にスレッドセーフです。しかし、それだけです。特別なAOTまたはJITの最適化も、ランタイムによって示される特別な動作もありません。それは非常に "人間の要因" - キンダのことです。
以下このクラスは不変です:
class Immutable {
private readonly String foo;
public Immutable(String foo, String bar) {
this.foo = foo;
this.Bar = bar;
}
public String Bar { get: }
public String Baz { get { return this.foo.Substring(0, 2); } }
}
すべてのフィールド(すなわち、そのインスタンスの状態は)readonly
と不変(System.String
がうまく不変であることが知られているので、我々はこれだけを知っている)の両方であるので、それは不変です。 foo
がStringBuilder
またはXmlElement
に変更された場合、それはもはや不変ではありません。厳密に言えば、readonly
修飾子は不変のために必要ではありません
注、それだけで実証することが容易になり、それはコンパイル時の強制(およびおそらくいくつかのランタイムの最適化)のいくつかのレベルを追加しません。比較のために、このクラスは不変ではありません(つまり、このクラスは不変ではありません)。それは)変更可能である。
class Mutable {
private readonly Int32[] values;
public Mutable(Int32 values) {
this.values = values;
}
public Int32[] GetValues() {
return this.values;
}
}
ため可変である:
変更可能である
Int32[]
(配列型)それはA受け入れるGetValues
- 介して可変配列への参照を返します建設中に変更可能なオブジェクトパラメータ。
ここでは不変ではない理由を証明する例を示します
Int32[] values = { 0, 1, 2, 3 };
Mutable mutable = new Mutable(values);
Print(mutable.GetValues()); // prints "0, 1, 2, 3"
values[0] = 5;
Print(mutable.GetValues()); // prints "5, 1, 2, 3"
Mutable
が不変であればMutable
のAPIを使用した場合、その後values
以降の変更は見えない。Print
への2回目の呼び出しが表示されます最初の出力と同じ出力。
しかし、配列や複合型を使用していても、不変型を持つことができます。これは、状態を変更するためのすべての方法を隠すことによって行われます。たとえば、Int32[]
の代わりにReadOnlyCollection<Int32>
を返し、渡されたすべての複雑で変更可能な値のディープコピー/クローンを常に実行します。しかし、コンパイラ、JIT、およびランタイムは、これがオブジェクト型を不変にレンダリングするかどうかを判断するにはまだ洗練されていません。なぜそれを文書化し、消費者が正しく使用するように信用しなければならないのですか?彼らはそれを正しく実装しました)
出典
2016-10-03 06:43:31
Dai
[変更可能と不変の違いは何ですか?](http://stackoverflow.com/questions/3811016/what-is-the-difference-between-mutable-and-不変) – walther
投稿する前に回答を検索して、重複した質問をしないでください。 – walther
@walther:私の質問をお読みください!私は可変クラスを作る方法を尋ねました。私は変更可能で不変なものを知っています。しかし、それが作成になると、私はそれについて知りません。あなたが言った質問は違う! – Yash