C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Linq.Expressions;

namespace INPEXOne.LearnCS
{
    class RefletLambdaDelegate
    {
        static object[] parameters = new object[] { 1, 2 };
        public delegate int addDelegate(int a, int b);

        public int add(int a ,int b)
        {
            return a + b;
        }

        public static void Main()
        {
            RefletLambdaDelegate rld=new RefletLambdaDelegate();
            //利用反射调用add方法.
            MethodInfo add = typeof(RefletLambdaDelegate).GetMethod("add");
            Console.WriteLine("The add result from using the reflection is : {0}",add.Invoke(rld, parameters));

            //利用Lambda表达式树调用add方法.
            Expression<Func<int, int, int>> extree = (a,b) => rld.add(a, b);
            Func<int, int, int> delinstance = extree.Compile();
            int result = delinstance(int.Parse(parameters[0].ToString()), int.Parse(parameters[1].ToString()));
            Console.WriteLine("The add result from using the LambdaTree is : {0}",result);

            //利用Lambda表达式调用add方法.
            Func<int, int, int> addLambda = (c, d) => rld.add(c, d);
            int result1 = addLambda(int.Parse(parameters[0].ToString()), int.Parse(parameters[1].ToString()));
            Console.WriteLine("The add result from using the Lambda without tree is : {0}",result1);

            //利用委托调用add方法.
            addDelegate addDelgateInstance = new addDelegate(rld.add);
            int result2 = addDelgateInstance(int.Parse(parameters[0].ToString()), int.Parse(parameters[1].ToString()));
            Console.WriteLine("The add result from using the delegate is : {0}", result2);

            //利用匿名方法调用add方法.
            addDelegate AnonymousInstance = delegate(int a, int b) { return rld.add(a,b); };
            int result3 = AnonymousInstance(int.Parse(parameters[0].ToString()), int.Parse(parameters[1].ToString()));
            Console.WriteLine("The add result from using the anonymous method is : {0}", result3);
            Console.ReadLine();
        }
    }
}

以上代码分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较,输出结果为:

时间: 2024-10-16 07:18:27

C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。的相关文章

Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnb

C# 通过反射执行已存在于类中的方法 通过字符串执行方法

通过字符串执行方法,在可能会调用不同方法时对不同方法进行调用 以下为实例: 1 public class ABC 2 { 3 string str = "通过反射执行的方法"; 4 //Class:要反射的Method所在类名 5 Type type = typeof(Class); 6 //funcName:进行反射的方法名称,第二个参数指定方法的搜索范围,当前为搜索private的方法,没有第二个参数则为public的方法 7 MethodInfo mt = type.GetMet

在web项目启动时,执行某个方法

在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到了项目初始数据需要跟其他项目同步的问题,也就是说在项目部署后,启动的时候就要同步另外一个项目的数据,这里写了个简单的实例,用的是监听器机制,创建一个类实现ServletContextListener 接口,实现里面的contextInitialized和contextDestroyed方法. pac

在web项目启动时,使用监听器来执行某个方法

在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 这里写了个简单的实例,用的是监听器机制,创建一个类实现ServletContextListener 接口,实现里面的contextInitialized和contextDestroyed方法. 1 package com.test.listener; 2 3 import javax.servlet.Servl

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数. [csharp] view plaincopy class Program { delegate int CalculateDelegate(int a, int b); int add(int a, int b) { return a + b; } s

model中设置默认值时 ,使用 lambda 与否的差别以及datetime的默认值方法

'date': '2013-01-01'  #固定值 'date': time.strftime('%Y-%m-%d')  #启动时候的值 'date': lambda *a: time.strftime('%Y-%m-%d')  #当前日期   6.1后,官方建议date/datetime的默认值的写法是(能解决时区问题): 'birthdate': fields.date.context_today, 'create_at': fields.datetime.now, model中设置默认值

C#委托------匿名方法

namespace out_ref { //委托匿名方法 public delegate void Myadd(); class Program { static void Main(string[] args) { Say(delegate() { Console.WriteLine("哈哈,就是这么帅!"); }); Console.ReadKey(); } static void Say(Myadd myadd) { myadd(); } } } //委托匿名方法 求两个数之和

C++11中的匿名函数 lambda函数 lambda表达式

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture](parameters)->return-type{body} 如果没有参数,空的圆括号()可以省略.返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:   [captur