我的C#高级特性-委托的认识

1.什么是委托?

委托:是一种引用类型,表示对具有特定参数列表和返回类型的方法应用。在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联。可通过委托实例调用方法。也可以使用委托将方法参数传递给其它方法。

2.委托的作用?

委托可以大大提高程序的可扩展性,还可以避免在程序中大量使用if-else语句。

3.委托的声明。

public delegate <return type> <delegate name> <parameter list>
//<return type>为返回类型
//delegate name>为委托的命名
//<parameter list>表示参数列表
//列如
public delegate string TranslationDelegate (string s)
//上面的列举的委托可以引用任何带有一个单一string类型的参数,并且返回一个string类型的方法。

4.委托的使用。

4.1委托的实例化

TranslationDelegate transform=new TranslationDelegate(ChineseSayHello);
//其中,ChineseSayHello是中文问好的方法的引用。如此,通过实例化委托将委托与被委托的方法联系起来。在C#2.0的语法中,实例化委托可以简写为将方法引用直接指向委托,如:TranslationDelegate transform=ChineseSayHello;

4.2调用委托

一般可以使用委托对象的Invoke()方法来调用委托。如

transform.Invoke("张三");

调用了中文翻译的委托方法,其中张三是委托的实际参数值。为了简化委托的调用,可以省略Invoke()方法,简化后为

transform("张三");

4.3多番委托

委托对象有一个好的属性,可以通过使用“+”运算符将多个对象分配到一个委托实例上,形成多番委托。多番委托包含已经分配的委托列表。因此,多番委托被调用时会依次调用列表中的委托。但多番委托仅可以合并类型相同的委托。使用“-”运算符可以从多番委托中删除组件委托。

4.4使用委托将方法作为参数传递给另一个方法。

定义用户行为类,如

public class User
{
  public delegate void UserAction();
  public void TakeAction(UserAction userAction)
  {
       userAction.Invoke();
  }
}

执行用户的行为方法,如

class Program
{
     static void Main(string[] args) 
     {
         User user=new User(){};
         user.TakeAction(Quench);
         user.TakeAction(WaterFlowers);
     }
     public static void Quench()
     {
           Console.WriteLine("取水解渴。");
     }
     public static void WaterFlowers()
     {
           Console.WriteLine("取水浇花。");
     }
 }
}

5.小实践

 public delegate void TranslationDelegate(string name);
 public delegate int CalDelegate(int a ,int b);
 public class Program
    {
       static void Main(string[] args)
        {
          //根据名称模糊查询
            string name = Console.ReadLine();
            RbacDBEntities db = new RbacDBEntities();
            var roles = db.Roles.Where(p => p.Name.Contains(name)).ToList();
            foreach (var item in roles)
            {
                Console.WriteLine(item.Name);
            }
            //SayHello(AmericanSayHello, "烦饭");
            //SayHello(ChineseSayHello, "呕泥浆");
            //TranslationDelegate chinaTransfer = new TranslationDelegate(ChineseSayHello);
            //string onj = chinaTransfer.Invoke("呕泥浆");
            //Console.WriteLine(onj);
            //TranslationDelegate americanTransfer = new TranslationDelegate(AmericanSayHello);
            //string ff = americanTransfer.Invoke("烦饭");
            //Console.WriteLine(ff);
            //TranslationDelegate a = new TranslationDelegate(ChineseSayHello);
            //a+= new TranslationDelegate(AmericanSayHello);
            //a.Invoke("欧尼酱:");
            //匿名方法
            TranslationDelegate Japan = delegate (string name)
            {
                Console.WriteLine(name + "莫西莫西");
            };
            //Lambda
            TranslationDelegate Japann = new TranslationDelegate(
                name => Console.WriteLine(name + "莫西莫西")
            );
            Japann.Invoke("欧尼酱:");
            Console.WriteLine("请输入第一个数");
            int a = int.Parse(Console.ReadLine());
            Console.WriteLine("请输入第二个数");
            int b = int.Parse(Console.ReadLine());
            Console.Write("加:");
            Cal(Jia, a, b);
            Console.Write("减:");
            Cal(Jian, a, b);
            Console.Write("乘:");
            Cal(Cheng, a, b);
            Console.Write("除:");
            Cal(Chu, a, b);
            Console.ReadKey();
        }
        //给中国人打招呼的方法
        public static string ChineseSayHello(string name)
        {
            return name + ":吃了没";
            //给美国人打招呼的方法
        }
         public static string AmericanSayHello(string name)
        {
            return name + ":Hey,Man!";
        }
        //定义一个通用的方式
        //public static void SayHello(TranslationDelegate hello, string name)
        //{
        //    Console.WriteLine(hello.Invoke(name));
        //}
        public static int Jia(int a, int b)
        {
            return a + b;
        }
         public static int Jian(int a, int b)
        {
            return a - b;
        }
         public static int Cheng(int a, int b)
        {
            return a * b;
        }
         public static int Chu(int a, int b)
        {
            return a / b;
        }
         public static void Cal(CalDelegate cal, int a, int b)
        {
            Console.WriteLine(cal.Invoke(a, b));
        }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值