委托笔记(一)

委托用于将方法作为参数传递给其他方法,委托应用的示例:

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

namespace DelegateApp
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Program
    {
        //定义FILTER委托      
        public delegate bool FilterDelegate(Person p);

        static void Main(string[] args)
        {
            //Create Person objects      
            Person p1 = new Person() { Name = "John", Age = 41 };
            Person p2 = new Person() { Name = "Jane", Age = 69 };
            Person p3 = new Person() { Name = "Jake", Age = 12 };
            Person p4 = new Person() { Name = "Jessie", Age = 25 };
            Person p5 = new Person() { Name = "Cherry", Age = 6 };

            //Create a list of Person objects and fill it      
            List<Person> people = new List<Person>() { p1, p2, p3, p4, p5 };

            DisplayPeople("儿童:", people, IsChild);
            DisplayPeople("成人:", people, IsAdult);
            DisplayPeople("老人:", people, IsSenior);

            //调用方法不变,仅需增加委托调用的方法IsOnetoThree
            DisplayPeople("10岁~30岁之间:", people, IsOnetoThree);

            Console.Read();
        }

        /// <summary>   
        /// A method to filter out the people you need      
        /// </summary>  
        /// <param name="people">A list of people</param>   
        /// <param name="filter">A filter</param>  
        /// <returns>A filtered list</returns>    
        static void DisplayPeople(string title, List<Person> people, FilterDelegate filter)
        {
            Console.WriteLine(title);
            foreach (Person p in people)
            {
                if (filter(p))
                {
                    Console.WriteLine("{0}, {1} years old", p.Name, p.Age);
                }
            }
            Console.Write("\n\n");
        }

        //==========FILTERS===================     
        static bool IsChild(Person p)
        {
            return p.Age <= 18;
        }
        static bool IsAdult(Person p)
        {
            return p.Age >= 18;
        }
        static bool IsSenior(Person p)
        {
            return p.Age >= 65;
        }

        //扩展FILTERS
        static bool IsOnetoThree(Person p)  
        {
            return p.Age > 10 && p.Age < 30;
        }
    }
}

输出为:

儿童:
Jake, 12 years old
Cherry, 6 years old


成人:
John, 41 years old
Jane, 69 years old
Jessie, 25 years old


老人:
Jane, 69 years old


10岁~30岁之间:
Jake, 12 years old
Jessie, 25 years old

由此可见,DisplayPeople方法更易扩展维护。

 

多路委托:

using System;

delegate void MyDelegate(string s);

class MyClass
{
    public static void Main()
    {
        MyDelegate a, b, c, d;

        // 委托a
        a = s => { Console.WriteLine("Hello, {0}!", s); };

        // 委托b
        b = s => { Console.WriteLine("Goodbye, {0}!", s); };

        // 委托c,合并a+b
        c = a + b;

        // 委托d,调用委托c,移除a
        d = c - a;

        Console.WriteLine("调用delegate a:");
        a("A");
        Console.Write("\n");
        Console.WriteLine("调用delegate b:");
        b("B");
        Console.Write("\n");
        Console.WriteLine("调用delegate c:");
        c("C");
        Console.Write("\n");
        Console.WriteLine("调用delegate d:");
        d("D");

        Console.ReadKey();
    }
}

输出为:

调用delegate a:
Hello, A!

调用delegate b:
Goodbye, B!

调用delegate c:
Hello, C!
Goodbye, C!

调用delegate d:
Goodbye, D!

posted @ 2012-05-31 13:58  flytothemoon  阅读(379)  评论(0编辑  收藏  举报