栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

c#3.0实现延迟赋值示例

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c#3.0实现延迟赋值示例

延迟赋值主要有两点:

1.一个参数可能或可能没被赋值.

2.一个参数在一个函数中每次使用时可能被赋值.

如下面的这种情况:
复制代码 代码如下:
int Add(int x, int y)
{
    return (2 + 1) + (1);
}

使用Func,我们轻松实现,看代码:
复制代码 代码如下:
///


/// Lazyexpression
///

/// T
public class Lazyexpression
{
    Func thunk;
    public Lazyexpression(Func Thunk)
    {
        thunk = Thunk;
    }
    public T evaluate()
    {
        return thunk();
    }
}

///


/// LazyBoolexpression
///

public static class LazyBoolexpression
{
    public static bool And(Lazyexpression LHS, Lazyexpression RHS)
    {
        return LHS.evaluate() && RHS.evaluate();
    }
    public static bool Or(Lazyexpression LHS, Lazyexpression RHS)
    {
        return LHS.evaluate() == true ? true : RHS.evaluate();
    }
}

///


/// LazyMemoizedexpression
///

///
public class LazyMemoizedexpression
{
    bool thunked;
    T value;
    Func thunk;
    public LazyMemoizedexpression(Func Thunk)
    {
        thunked = false;
        thunk = Thunk;
    }
    public T evaluate()
    {
        if (!thunked)
        {
            value = thunk();
            thunked = true;
        }
        return value;
    }
}

Lazyexpression类实现了基本的延迟赋值,LazyMemoizedexpression类实现了一次赋值,多次使用.
LazyBoolexpression实现逻辑表达式.

看UnitTest,一切就明白了
复制代码 代码如下:
///


///Laziestheexpressiontest.
///

[TestCase]
publicvoidLazyexpressionTest()
{
varlme1=newLazyexpression(()=>2+1);
varlme2=newLazyexpression(()=>1);
Assert.AreEqual(4,Add(lme1,lme2));
}

///


///Addsthespecifiedx.
///

///Thex.
///They.
///result
privateintAdd(Lazyexpressionx,Lazyexpressiony)
{
returnx.evaluate()+y.evaluate();
}

///


///Laziestheexpressionwithlogic.
///

[TestCase]
publicvoidLazyexpressionWithLogic()
{
varexp1=newLazyexpression(()=>true);
varexp2=newLazyexpression(()=>true||false);
if(LazyBoolexpression.And(exp1,exp2))
{
Console.WriteLine("lazyand");
}
if(LazyBoolexpression.Or(exp1,exp2))
{
Console.WriteLine("lazyor");
}
}

///


///Laziesthememoizedexpressiontest.
///

[TestCase]
publicvoidLazyMemoizedexpressionTest()
{
varlme1=newLazyMemoizedexpression(()=>GetIntResult());
Assert.AreEqual(943,lme1.evaluate());
Assert.AreEqual(943,lme1.evaluate());
//output:
//1passed,0failed,0skipped,took2.80seconds(NUnit2.5).
}

///


///Comparestolazyexpressiontest.
///

[TestCase]
publicvoidCompareToLazyexpressionTest()
{
varlme1=newLazyexpression(()=>GetIntResult());
Assert.AreEqual(943,lme1.evaluate());
Assert.AreEqual(943,lme1.evaluate());
//output:
//1passed,0failed,0skipped,took4.80seconds(NUnit2.5).
}

///


///Getstheintresult.
///

///
privateintGetIntResult()
{
//currentthreadsleeptwosecond.
System.Threading.Thread.Sleep(2000);
return943;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/126643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号