スタックオーバーフローとインターネット全面的に、構造体を変更不可能に保つことが良い設計原則であることがわかります。残念ながら、実際にこれらの構造体が本当に不変になるような実装はありません。structを不変にするにはどうしたらいいですか?
構造体に内部に参照型がないと仮定すると、構造体を実際には不変にするにはどうすればよいですか?つまり、どのようにしてプリミティブフィールドのいずれか(おそらくコンパイル時/ランタイム例外による)の突然変異を防ぐのですか?
私は構造体は不変作る試みて簡単なテストを書きましたが、それでもSystem.ComponentModel.ImmutableObjectAttribute
を使用していないが働いた:
class Program
{
static void Main(string[] args)
{
ImmutableStruct immStruct1 = new ImmutableStruct();
Console.WriteLine(immStruct1); //Before mutation.
immStruct1.field1 = 1;
immStruct1.field2 = "Hello";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 1st mutation.
immStruct1.field1 = 2;
immStruct1.field2 = "World";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 2nd mutation.
Console.ReadKey();
}
}
[ImmutableObject(true)]
struct ImmutableStruct
{
public int field1;
public string field2;
public object field3;
public override string ToString()
{
string field3String = "null";
if (field3 != null)
{
field3String = field3.GetHashCode().ToString();
}
return String.Format("Field1: {0}, Field2: {1}, Field3: {2}", field1, field2, field3String);
}
}
ビットOTですが、クラスを使用する代わりに構造体が必要な特定の理由がありますか?長年にわたるLOBプログラミングでは、構造体がクラスに比べて好ましいユースケースは見つかりませんでした。 – StingyJack
フィールドに読み取り専用をマークしますか?また、あなたはこれを見たことがあります:http://stackoverflow.com/questions/29974301/should-a-c-sharp-struct-have-only-read-only-properties – Pawel
頭に構造体は、C + +のビットフィールドの構造体に似ています。構造体はインスタンス化されており、構造体が決して変更されないことが私の望みです。私が偶然にデータを変更していないという約束があります。 –