延迟加载字典
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;
}
我有一些代码可以填满两个字典
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;
}