加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:55:30 所属栏目:百科 来源:网络整理
导读:我们的代码库中的几个方法使用’MaybeObject’,可以在结果可能已知时传递给函数,或者可能依赖于尚未执行的外部Web服务调用.例如,下面的属性可以具有指定的已知值,或者如果未指定并在异步调用完成后调用它将返回异步调用的结果. private string _internalStri
我们的代码库中的几个方法使用’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);
}

也可以看看:

> Delegates
> Anonymous Methods
> Lambda Expressions

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读