码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-09 11:13:58      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   使用   ar   数据   

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

  1. 什么是委托?

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

下面是一个示例代码

bubuko.com,布布扣
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);
            }

        }
    }
}
简单委托定义

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

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

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

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

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

bubuko.com,布布扣

我们可以把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);
        }
    }
}

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

 

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

标签:style   blog   http   color   os   io   使用   ar   数据   

原文地址:http://www.cnblogs.com/renyanlei/p/3934768.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!