第八章 委托与事件 读书心得

8

委托与事件一般情况下都是一起使用,事件是特殊化的委托。

委托:是一个可以对方法进行引用的类型。

委托类型一旦为委托定义了方法,委托将与该方法具有完全相同的行为,委托方法的调用和其他方法调用一样

具有参数和返回值,但分配给委托的方法必须与委托的返回类型和参数组成匹配。

特点:

 委托是一种特殊对象类型:以前定义的对象包含数据,而委托只包含方法的地址。

 委托类似于C++中的函数指针,但它是类型安全的。

 委托允许将方法作为参数进行传递。

 委托可用于定义回调方法。

委托可以链接在一起。

方法不必与委托签名完全匹配。

例子:8.1 使用委托

 

View Code
  public delegate void MyFirstDelegate(string message);
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
            myFirst("委托本事调用了委托");
        }

    }

    class MyClass
    {
        public void WriteFirstMessage(string message)
        {
            Console.WriteLine(message);
        }
    }

运行结果:

例子8.2:委托调用静态方法

View Code
    public delegate void MyFirstDelegate(string message);
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
            myFirst("委托本事调用了委托");
            myFirst = new MyFirstDelegate(myClass.WriteSecondMessage);
            myFirst("委托调用了静态方法");
            Console.ReadKey();

        }
        
    }

    class MyClass
    {
        public void WriteFirstMessage(string message)
        {
            Console.WriteLine(message);
        }

        public void WriteSecondMessage(string message)
        {
            Console.WriteLine(message);
        }
    }

运行结果:

例子8.3委托作为参数调用

 

View Code
public delegate void MyDelegate(int i,int j);
    class Program
    {
        static void Main(string[] args)
        {
            MyNewClass.MethodDelegate(1010, MyNewClass.Sum);
            MyNewClass.MethodDelegate(1010, MyNewClass.Product);
            Console.ReadKey();
        }
    }

    class MyNewClass
    {
        public static void Sum(int i, int j)
        {
            int sum = i + j;
            Console.WriteLine("和:{0}+{1}={2}",i,j,sum);
        }

        public static void Product(int i, int j)
        {
            int product = i * j;
            Console.WriteLine("积:{0}*{1}={2}", i, j, product);
        }

        public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
        {
            myDelegate(i, j);
        }
    
    }

运行结果:

 

例子8.4 多重委托

 

View Code
 delegate void MyDelegate(int i,int j);
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            MyDelegate del = new MyDelegate(p.Method);
            del(1020);
            Console.WriteLine("使用+运算符后,显示效果");
            del += p.Method1;
            del(2020);
            Console.WriteLine("使用-运算符后,显示效果");
            del -= p.Method;
            del(2020);
            Console.ReadKey();

        }

        void Method(int i, int j)
        {
            Console.WriteLine("求和:{0}+{1}={2}",i,j,i+j);
        }
        void Method1(int i, int j)
        {
            Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
        }
    }

运行结果:

 

例子8.5 实例化委托的两种方法

 

View Code
class Program
    {
        public delegate void MyDelegate(string s);
        static void Main(string[] args)
        {
            MyDelegate myDel = delegate(string j)
            {
                System.Console.WriteLine(j);
            };

            myDel("使用匿名方法实例化委托");
            myDel = new MyDelegate(Program.DoWork);
            myDel("不使用匿名方法实例化委托");
            Console.ReadKey();
        }

        static void DoWork(string k)
        {
            System.Console.WriteLine(k);
        }
    }

运行结果:

例子8.6 使用Lambda表达式

 

 

 

posted @ 2012-02-09 00:29  ComBat  阅读(177)  评论(0编辑  收藏  举报