c#3.0实现延迟赋值示例

时间:2023-01-04 16:28:51 

延迟赋值主要有两点:

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

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

如下面的这种情况:


int Add(int x, int y)
{
    return (2 + 1) + (1);
}

使用Func<T>,我们轻松实现,看代码:


/// <summary>
/// LazyExpression
/// </summary>
/// <typeparam name="T">T</typeparam>
public class LazyExpression<T>
{
    Func<T> thunk;
    public LazyExpression(Func<T> Thunk)
    {
        thunk = Thunk;
    }
    public T Evaluate()
    {
        return thunk();
    }
}

/// <summary>
/// LazyBoolExpression
/// </summary>
public static class LazyBoolExpression
{
    public static bool And(LazyExpression<bool> LHS, LazyExpression<bool> RHS)
    {
        return LHS.Evaluate() && RHS.Evaluate();
    }
    public static bool Or(LazyExpression<bool> LHS, LazyExpression<bool> RHS)
    {
        return LHS.Evaluate() == true ? true : RHS.Evaluate();
    }
}

/// <summary>
/// LazyMemoizedExpression
/// </summary>
/// <typeparam name="T"></typeparam>
public class LazyMemoizedExpression<T>
{
    bool thunked;
    T value;
    Func<T> thunk;
    public LazyMemoizedExpression(Func<T> Thunk)
    {
        thunked = false;
        thunk = Thunk;
    }
    public T Evaluate()
    {
        if (!thunked)
        {
            value = thunk();
            thunked = true;
        }
        return value;
    }
}

LazyExpression<T>类实现了基本的延迟赋值,LazyMemoizedExpression<T>类实现了一次赋值,多次使用.
LazyBoolExpression实现逻辑表达式.

看UnitTest,一切就明白了


///<summary>
///Laziestheexpressiontest.
///</summary>
[TestCase]
publicvoidLazyExpressionTest()
{
varlme1=newLazyExpression<int>(()=>2+1);
varlme2=newLazyExpression<int>(()=>1);
Assert.AreEqual(4,Add(lme1,lme2));
}

///<summary>
///Addsthespecifiedx.
///</summary>
///<paramname="x">Thex.</param>
///<paramname="y">They.</param>
///<returns>result</returns>
privateintAdd(LazyExpression<int>x,LazyExpression<int>y)
{
returnx.Evaluate()+y.Evaluate();
}

///<summary>
///Laziestheexpressionwithlogic.
///</summary>
[TestCase]
publicvoidLazyExpressionWithLogic()
{
varexp1=newLazyExpression<bool>(()=>true);
varexp2=newLazyExpression<bool>(()=>true||false);
if(LazyBoolExpression.And(exp1,exp2))
{
Console.WriteLine("lazyand");
}
if(LazyBoolExpression.Or(exp1,exp2))
{
Console.WriteLine("lazyor");
}
}

///<summary>
///Laziesthememoizedexpressiontest.
///</summary>
[TestCase]
publicvoidLazyMemoizedExpressionTest()
{
varlme1=newLazyMemoizedExpression<int>(()=>GetIntResult());
Assert.AreEqual(943,lme1.Evaluate());
Assert.AreEqual(943,lme1.Evaluate());
//output:
//1passed,0failed,0skipped,took2.80seconds(NUnit2.5).
}

///<summary>
///Comparestolazyexpressiontest.
///</summary>
[TestCase]
publicvoidCompareToLazyExpressionTest()
{
varlme1=newLazyExpression<int>(()=>GetIntResult());
Assert.AreEqual(943,lme1.Evaluate());
Assert.AreEqual(943,lme1.Evaluate());
//output:
//1passed,0failed,0skipped,took4.80seconds(NUnit2.5).
}

///<summary>
///Getstheintresult.
///</summary>
///<returns></returns>
privateintGetIntResult()
{
//currentthreadsleeptwosecond.
System.Threading.Thread.Sleep(2000);
return943;
}

标签:延迟赋值
0
投稿

猜你喜欢

  • C#实现的上传图片、保存图片、加水印、生成缩略图功能示例

    2022-03-02 03:17:29
  • android文件上传示例分享(android图片上传)

    2022-10-07 21:14:11
  • Java并发编程之闭锁与栅栏的实现

    2022-01-09 15:00:12
  • 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    2022-04-05 18:36:15
  • android TextView实现跑马灯效果

    2023-07-27 16:35:31
  • Kotlin启动协程的三种方式示例详解

    2023-06-07 02:58:53
  • 使用springboot打包成zip部署,并实现优雅停机

    2021-08-04 20:45:01
  • Java面向对象之内部类案例讲解

    2021-09-16 13:28:19
  • Android编程之菜单实现方法

    2023-12-21 16:41:24
  • java实战之桌球小游戏

    2022-04-22 20:40:13
  • 如何使用JCTools实现Java并发程序

    2023-11-21 07:37:39
  • Java 17 更快的 LTS 节奏

    2023-07-08 11:36:19
  • C#、ASP.NET通用扩展工具类之LogicSugar

    2023-11-18 09:56:07
  • Spring @Import注解的使用

    2022-03-26 16:38:43
  • Java Spring 事件监听详情解析

    2021-06-05 00:02:08
  • Spring @Bean注解深入分析源码执行过程

    2021-11-30 10:10:36
  • 一键移除ButterKnife并替换为ViewBinding的旧项目拯救

    2023-08-19 12:30:28
  • Android开发apk反编译和二次打包教程

    2022-09-19 12:01:16
  • Java数据结构之线性表

    2022-08-21 06:32:28
  • Java手写线程池的实现方法

    2023-10-30 12:50:03
  • asp之家 软件编程 m.aspxhome.com