当前位置:  编程技术>.net/c#/asp.net

c#3.0实现延迟赋值示例

    来源: 互联网  发布时间:2014-10-28

    本文导语:  延迟赋值主要有两点: 1.一个参数可能或可能没被赋值. 2.一个参数在一个函数中每次使用时可能被赋值. 如下面的这种情况: 代码如下:int Add(int x, int y){    return (2 + 1) + (1);} 使用Func,我们轻松实现,看代码: 代码如下:/// /...

延迟赋值主要有两点:

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;
}


    
 
 

您可能感兴趣的文章:

  • 如何实现给JavaBean赋值(要传给JavaBean的数值为数组)?
  • 实现在同一方法中获取当前方法中新赋值的session值解决方法
  • java实现简单的给sql语句赋值的示例
  • c语言判断某一年是否为闰年的各种实现程序代码 iis7站长之家
  • jQuery中的RadioButton,input,CheckBox取值赋值实现代码
  • 基于DIV+ul+li实现的表格(多示例)
  • python实现绘制树枝简单示例
  • c语言实现MD5算法完整代码示例
  • ThinkPHP实现事务回滚示例代码
  • 使用libpcap实现抓包程序的步骤及代码示例
  • 修改.htaccess实现301域名重定向示例分享
  • c++实现MD5算法代码示例
  • php实现数组筛选奇数和偶数示例
  • java Servlet实现Session创建存取以及url重写代码示例
  • python实现倒计时的示例
  • 数据结构:图(有向图,无向图),在Python中的表示和实现代码示例
  • python使用循环实现批量创建文件夹示例
  • android实现来电静音示例(监听来电)
  • strcpy函数实现简示例命分享
  • strcat函数实现简单示例
  • java实现jframe透明窗体示例
  • Thinkphp实现MySQL读写分离操作示例
  • C++实现顺序排序算法简单示例代码
  • c#实现md5加密示例
  • java实现网页解析示例
  • python实现图片批量剪切示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 比较急,向请各位求助了,关于实现微妙或者纳秒级别延迟的问题@@@@
  • 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • qt如何实现:操作键盘实现数据的滚动?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3