gpt4 book ai didi

用于生成共享相同闭包变量的匿名委托(delegate)的 C# 技术

转载 作者:太空狗 更新时间:2023-10-29 20:47:41 24 4
gpt4 key购买 nike

我有一种情况需要生成一些类似的匿名代表。这是一个例子:

public void Foo(AnotherType theObj)
{
var shared = (SomeType)null;

theObj.LoadThing += () =>
{
if(shared == null)
shared = LoadShared();

return shared.Thing;
};

theObj.LoadOtherThing += () =>
{
if(shared == null)
shared = LoadShared();

return shared.OtherThing;
};

// more event handlers here...
}

我遇到的麻烦是我的代码不是很干。每个事件处理程序的内容都非常相似,并且可以轻松地参数化为工厂方法。唯一阻止我这样做的是每个委托(delegate)都需要共享对 shared 变量的引用。我无法将 shared 传递给带有 ref 关键字的工厂方法,如 you can't create a closure around a ref varaiable .有什么想法吗?

最佳答案

没有什么问题不能通过增加更多的抽象来解决。 (*)

您一遍又一遍地重复的模式是“延迟加载”模式。该模式非常适合在类型中捕获,事实上,它已经出现在框架的版本 4 中。此处的文档:

http://msdn.microsoft.com/en-us/library/dd642331.aspx

然后你可以这样做:

public void Foo(AnotherType theObj)
{
var shared = new Lazy<SomeType>(()=>LoadShared());
theObj.LoadThing += () => shared.Value.Thing;
theObj.LoadOtherThing += () => shared.Value.OtherThing;
// more event handlers here...
}

好了。第一次访问 shared.Value 时加载该值;随后每次使用缓存值。额外的好处:如果在多个线程上访问共享值,这甚至是线程安全的。 (有关我们在线程安全方面做出的具体保证的详细信息,请参阅文档。)


(*) 当然除了“我有太多抽象”的问题。

关于用于生成共享相同闭包变量的匿名委托(delegate)的 C# 技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9841572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com