延迟加载字典

lazily load a dictionary

我有一些代码可以填满两个字典

void Load(out Dictionary<string, string> m1, out Dictionary<string, string> m2) { ... }

我只想在需要访问任一词典时执行。由于有许多方法依赖于正在加载的词典,我不想通过调用 Load 来污染所有这些方法,如下所示:

void DoSomething()
{
    if(notYetInitialized) 
        Load(out this.dict1, out this.dict2);
    // do something with either dict1 or dict2
}

或者,我可以在我的构造函数中调用该方法。然而,这意味着 Load 在任何情况下都会被调用,无论是否使用过这两个字典中的任何一个。这就是我查看 Lazy 的原因。但是因为我有 one 方法应该填充 two 参数,我不确定如何完成这项工作。

所以我想要实现的是这样的:

void DoSomething()
{
    var value = this.dict1[key]; // if dict1 is not yet loaded, call Load, which will also load dict2
}

您可以使用 Lazy<(Dictionary<string, string> m1, Dictionary<string, string> m2)>:

private Lazy<(Dictionary<string, string> m1, Dictionary<string, string> m2)> _lazy;
private Dictionary<string, string> _dict1 => _lazy.Value.m1;    
private Dictionary<string, string> _dict2 => _lazy.Value.m2;
public SomeCtor()
{
    _lazy = new Lazy<(Dictionary<string, string> m1, Dictionary<string, string> m2)>(
          () => (new Dictionary<string, string>(), new Dictionary<string, string>())); // your actual logic to load dictionaries

}

或者引入class/struct来包含你的词典。

您可以创建自己的结构来包含这两个词典,或者只为它们使用一个元组。

然后你可以像这样使用 Lazy 初始化它们:

public sealed class Test
{
    public Test()
    {
        _dicts = new Lazy<(Dictionary<string, string> m1, Dictionary<string, string> m2)>(initDicts);
    }

    public void DoSomething()
    {
        _dicts.Value.m1.Add("key", "value");
        _dicts.Value.m2.Add("key", "value");
    }

    (Dictionary<string, string> m1, Dictionary<string, string> m2) initDicts()
    {
        return (new Dictionary<string, string>(), new Dictionary<string, string>());
    }

    readonly Lazy<(Dictionary<string, string> m1, Dictionary<string, string> m2)> _dicts;
}

如果你定义一个嵌套结构来保存你的字典,它的可读性会更好一点:

public sealed class Test
{
    public Test()
    {
        _dicts = new Lazy<Dicts>(initDicts);
    }

    public void DoSomething()
    {
        _dicts.Value.M1.Add("key", "value");
        _dicts.Value.M2.Add("key", "value");
    }

    Dicts initDicts()
    {
        return new Dicts(
            new Dictionary<string, string>(),
            new Dictionary<string, string>());
    }

    readonly struct Dicts
    {
        public Dicts(Dictionary<string, string> m1, Dictionary<string, string> m2)
        {
            M1 = m1;
            M2 = m2;
        }

        public readonly Dictionary<string, string> M1;
        public readonly Dictionary<string, string> M2;
    }

    readonly Lazy<Dicts> _dicts;
}