5

私は現在、C# でインスタンスを不変にする 2 つの方法を知っています。

方法 1 - コンパイル時の不変性

void Foo() 
{
    // Will be serialized as metadata and inserted
    // as a literal. Only valid for compile-time constants
    const int bar = 100;
}

方法 2 - 読み取り専用フィールド

class Baz
{
    private readonly string frob;

    public Baz()
    {    
         // Can be set once in the constructor
         // Only valid on members, not local variables
         frob = "frob";
    }
}

一度インスタンス化されたインスタンスが変更されないという保証があると便利です。これを少しだけ行いますが、その範囲は限られていますconst。コンパイル時の定数とメンバー変数にreadonlyのみ使用できます。constreadonly

最初のインスタンス化後にローカル変数に不変性を与える方法はありますか (方法はreadonly機能しますが、より一般的なレベルで)。


Scala はvar、初期値を取得した後に再割り当てできない新しい不変値を宣言するキーワードを使用してこれを行います。

var xs = List(1,2,3,4,5) // xs is a value - cannot be reassigned to
xs = List(1,2,3,4,5,6);  // will not compile
4

2 に答える 2

5

constまたはを使用して既に述べたように、フィールドを除いて、C# で変数が再割り当てされるのを防ぐことはできませんreadonly

既存の可変型の独自の不変バージョンをラップするか、それが独自のクラスである場合は、不変になるように書き直すことができますが、質問が取得しているように見えるメソッドの変数に対してはそれを達成できませんで。

F# には不変性のためのオプションがいくつかあります (let私の記憶が正しければ ' キーワード)。C# にはありません。.NET の機能を活用したいが完全な不変性を備えている場合は、F# を検討する価値があるかもしれません。

于 2013-07-26T14:17:35.737 に答える
1

ラッパーが静的な場合、上書きできません。これにより、変数名と型の安全性に関するコンパイル時のチェックが犠牲になります。

public static class ReadOnly
{
    private static readonly Dictionary<string, object> values = new Dictionary<string, object>();

    public static bool SetValue(string name, object data)
    {
        if (values.ContainsKey(name))
            return false;

        values[name] = data;

        return true;
    }

    public static object GetValue(string name)
    {
        return values[name];
    }
}


        ReadOnly.SetValue("xs", 1);
        ReadOnly.SetValue("xs", 1); // will crash
于 2013-07-26T15:10:36.143 に答える