8

辞書であるプロパティを持つクラスがあります:

public class Entity 
{
    public Dictionary<string, string> Name { get; set; }
}

このプロパティをレイジー初期化を使用するように切り替えたいと思います。私は次のことを試しました:

public class Entity 
{
    private Lazy<Dictionary<string, string>> name = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
    public Dictionary<string, string> Name
    {
        get => name;
        set => name = value;
    }
}

名前と名前のタイプが異なるため、これはもちろんエラーです。しかし、私の一生の間、これを正しく指定する方法を理解することはできません。私が本当に望んでいるのは、名前にアクセスするまでNameをnullのままにして、最初の読み取りまたは書き込みで作成することです。

4

2 に答える 2

12

で初期化を使用できますが、Lazy必要なものは非常に単純で、これを簡単に実行できます

private Dictionary<string, string> _name;
public Dictionary<string, string> Name
{
    get
    {
        if (_name == null)
            _name = new Dictionary<string, string>();
        return _name;
    }
    set _name = value;
}

編集: このアプローチには、スレッド セーフの問題がいくつかあることに注意してください。これが問題になる可能性があるかどうかを確認してください。

于 2012-04-03T23:34:15.343 に答える
9

name.Value読み取り専用です。これを試して:

public class Entity 
{
    private Lazy<Dictionary<string, string>> name = 
        new Lazy<Dictionary<string, string>>(
            () => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
    
    public Dictionary<string, string> Name => name.Value;
}
于 2012-04-03T23:41:24.667 に答える