委托是怎么最终变成linq表达式的?(上)

前不久,给学生们做培训,讲到C#语言委托部分的时候。我用了一天的时间。把委托讲到了linq表达式。但是呢!学生们反应并不是很好。貌似没有彻底领悟到这其中的过程。我写下这篇文章。也算是对学生们一个交代总结吧!

  1. 什么是委托?

我们其实可以把委托理解成含有一个或者多个方法的对象。我们在大多数时候用到委托都是在”执行“这个对象。但是委托却又和一般的对象不同,我们需要执行他所拥有的方法。

下面是一个示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delegate
{
    delegate void MyPrint(int value);  //定义委托
    class Program
    {

        void ChinesePrint(int value)
        {
            Console.WriteLine("中国人的国土面积{0}",value);
        }

        //两个和定义委托返回值参数相同的方法

        void JapanesePrint(int value)
        {
            Console.WriteLine("日本人的国土面积{0}",value);
        }

        static void Main(string[] args)
        {
            Program p = new Program();//声明当前类
            Console.WriteLine("请输入国家");
            string Country = Console.ReadLine();
            if (Country.Equals("japanese"))
            {
                MyPrint printdelegate = new MyPrint(p.ChinesePrint);
                printdelegate(1235);
            }
            else
            {
                MyPrint printdelegate = new MyPrint(p.ChinesePrint);
                printdelegate(9600000);
            }

        }
    }
}

简单委托定义

我们现在来看看委托和类的一些对比,委托也是用户自定义的类型,但类表示的是封装数据和方法的集合,而委托则持有一个或者多个的方法,以及一系列的自定义操作。
①:声明一个委托类型,委托看上起和方法的生命很相似,但是委托没有实现。

②:使用该委托类型声明一个委托变量。

③:创建一个委托类型的对象,把它赋值给委托变量。新的委托对象包含指向某个方法的引用,这个方法的签名和返回值必须一致。

④:可以为委托对象增加其他方法。

⑤:在代码中调用委托可以像调用方法那样。其中包含的方法全部被执行。

我们可以把delegate看作是一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。委托保存的方法可以来自任何类和结构。

如何声明委托类型

delegate(关键字) void(返回类型) MyDelgate(签名)(int x)(参数)

委托类型的声明看上去与方法的声明很相似,有返回类型和签名。返回类型和签名指定了委托的方法的接收方式。

①:以delegate关键字开头;

②:没有方法的主体。

创建委托对象

委托是引用类型,因此有引用和对象。在委托类型声明之后,我们可以声明变量并创建类型的对象。如下代码演示了委托类型的变量声明:

MyDel delvar

(委托类型) (变量)

有两种创建委托的对象的方式,第一种是使用new运算符的对象表达式,如下所示

①:委托类型名

②:一组圆括号,其中包含作为调用列表中第一个成员的方法的名字。方法可以是实例方法也可以是静态方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   public delegate  int MyDelegate(string  name);
    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate Mydel1 = new MyDelegate(Max);
            MyDelegate Mydel2 = new MyDelegate(Min);

            MyDelegate MyDel = Max;//也可以使用快捷语法,直接将方法名称赋予MyDel

        }

        static int Max(string i)
        {

            return int.Parse(i);
        }

        static int Min(string i)
        {
            return int.Parse(i);
        }
    }
}

下面的代码创建了两个委托对象,一个具有实例方法,而另一个具有静态方法。

时间: 2024-12-22 06:58:10

委托是怎么最终变成linq表达式的?(上)的相关文章

委托是怎么最终变成linq表达式的?(下)

扩展方式(Extension Method)是给那些不是你拥有的,因而不能直接修改的类添加方法的一种方便的方法.首先我们定义一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Rocky { public class Product { public int ProductID { set; get; } public string Name { s

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[] para

委托,匿名函数和lambda表达式

很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一下自己对他的印象,顺便把自己的感悟和想法写出来,以便自己能有更深的理解,由于本人水平有限,也欢迎大家多多探讨,有问题大家一起解决一起进步. MSDN上面对委托的定义是:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在我看来委托的特性主要在: 1.把一个方法当做一个参数传递给

通过LINQ表达式树动态构建查询条件

第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expr

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

Expression<Func<Order_info, bool>> expre = expression; var q = db.order_info; IQueryable<Order_info> query = q; if (expre != null) { query = query.Where(expre); } 修改为: 1 Expression<Func<Order_info, bool>> expre = expression;

3 委托、匿名函数、lambda表达式

委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式 // 声明一个委托 delegate void Printer(string s); class TestClass { static void Main() { //lambda表达式 Printer pp = x => { Console.WriteLine(&quo

Linq表达式和Lambda表达式用法对比

什么是Linq表达式?什么是Lambda表达式?前一段时间用到这个只是,在网上也没找到比较简单明了的方法,今天就整理了一下相关知识,有空了再仔细研究研究 public Program() { List<Student> allStudent = new List<Student> { new Student("张三",23), new Student("李四",29), new Student("王二",25), new

Linq表达式理解错误

var userInfo = UserInfoService.LoadEntities(u=>u.ID==LoginUser.ID).FirstOrDefault(); //获取登录用户的角色. var userRoleInfo = userInfo.RoleInfo; //Linq表达式一: var loginUserMenuActions = (from r in userRoleInfo from a in r.ActionInfo where a.ActionTypeEnum == ac

LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”. 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.NotSupportedTranslator.Translate(ExpressionConverter