c# – 何时评估闭包中的属性?

前端之家收集整理的这篇文章主要介绍了c# – 何时评估闭包中的属性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们的代码库中的几个方法使用’MaybeObject’,可以在结果可能已知时传递给函数,或者可能依赖于尚未执行的外部Web服务调用.例如,下面的属性可以具有指定的已知值,或者如果未指定并在异步调用完成后调用它将返回异步调用的结果.
  1. private string _internalString;
  2. public string stringProp
  3. {
  4. get
  5. {
  6. if (!string.IsNullOrEmpty(_internalString))
  7. return _internalString;
  8. return resultOfAsyncCallFromSomewhereElse;
  9. }
  10.  
  11. set { _internalString = value; }
  12. }

显然,尝试在异步调用完成之前引用该属性会导致空引用异常,因此我们还有一个标志来检查该值是否可用.

问题是,在下面的代码中,将创建lambda尝试并评估stringProp(可能尚未填充),或者将延迟评估,直到调用生成的Action(在检查异步操作完成后) ?

  1. public Action ExampleMethod(MaybeObject maybe)
  2. {
  3. return () => doSomethingWithString(maybe.stringProp);
  4. }

解决方法

评估将推迟到调用最终的Action之后.

委托引用的代码仅在显式调用委托本身时执行,而不管代理本身是如何创建的.

例如,传递代码以通过Action委托执行的这些方法都是等效的,并且在调用Action()之前不会执行doSomethingWithString方法

显式方法(.NET 1.1):

  1. private MaybeObject maybe;
  2.  
  3. public Action ExampleMethod()
  4. {
  5. return new Action(DoSomethingWithMaybeObject);
  6. }
  7.  
  8. private void DoSomethingWithMaybeObject()
  9. {
  10. doSomethingWithString(maybe.stringProp)
  11. }

匿名方法(.NET 2.0):

  1. public Action ExampleMethod(MaybeObject maybe)
  2. {
  3. return delegate() { doSomethingWithString(maybe.stringProp) };
  4. }

Lambda(.NET 3.5):

  1. public Action ExampleMethod(MaybeObject maybe)
  2. {
  3. return () => doSomethingWithString(maybe.stringProp);
  4. }

也可以看看:

> Delegates
> Anonymous Methods
> Lambda Expressions

猜你在找的C#相关文章