我们的代码库中的几个方法使用’MaybeObject’,可以在结果可能已知时传递给函数,或者可能依赖于尚未执行的外部Web服务调用.例如,下面的属性可以具有指定的已知值,或者如果未指定并在异步调用完成后调用它将返回异步调用的结果.
private string _internalString; public string stringProp { get { if (!string.IsNullOrEmpty(_internalString)) return _internalString; return resultOfAsyncCallFromSomewhereElse; } set { _internalString = value; } }
显然,尝试在异步调用完成之前引用该属性会导致空引用异常,因此我们还有一个标志来检查该值是否可用.
问题是,在下面的代码中,将创建lambda尝试并评估stringProp(可能尚未填充),或者将延迟评估,直到调用生成的Action(在检查异步操作完成后) ?
public Action ExampleMethod(MaybeObject maybe) { return () => doSomethingWithString(maybe.stringProp); }
解决方法
评估将推迟到调用最终的Action之后.
委托引用的代码仅在显式调用委托本身时执行,而不管代理本身是如何创建的.
例如,传递代码以通过Action委托执行的这些方法都是等效的,并且在调用Action()之前不会执行doSomethingWithString方法:
显式方法(.NET 1.1):
private MaybeObject maybe; public Action ExampleMethod() { return new Action(DoSomethingWithMaybeObject); } private void DoSomethingWithMaybeObject() { doSomethingWithString(maybe.stringProp) }
匿名方法(.NET 2.0):
public Action ExampleMethod(MaybeObject maybe) { return delegate() { doSomethingWithString(maybe.stringProp) }; }
Lambda(.NET 3.5):
public Action ExampleMethod(MaybeObject maybe) { return () => doSomethingWithString(maybe.stringProp); }
也可以看看:
原文地址:https://www.jb51.cc/csharp/99967.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。