委托基应用及系统定义的委托

Posted xiaowie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托基应用及系统定义的委托相关的知识,希望对你有一定的参考价值。

 一

提问:能不能把方法作为参数传递?????

也即使能能不能声明一个存放方法的变量呢——委托

委托是一种数据类型,像类一样(可以生命委托类型变量),委托是用来接受方法的,通过委托可以吧方法作为参数进行传递

    class Program
    {
        public delegate void AddDelegate(); //定义无返回值无参数的委托

        static void Main(string[] args)
        {
            //【1】第一种方式
            //AddDelegate my = add;
            //  my();
            //【2】第二种方式
            AddDelegate my = new AddDelegate(add);
            my.Invoke();
            Console.ReadKey();

            //你定义的委托没有参数没有返回值,方法也是要没有参数没有返回值的
            //在使用委托的时候 通过委托变量来调用  可以把Invoke方法省略掉。
            
        }

        public static void add()
        {

            Console.WriteLine("恭喜你");
        }
    }

 

 

二 

 需求:假设一件事情在前面和后面要做的事情比较固定,(这里假设输出“==========”),但是中间要做的事情经常发生改变,(比如

1.要输出系统当前时间到控制台,2.要输出系统当前是星期几3.要吧系统时间写入到文本文件等)。

    class Class1
    {
        public void Print(PrintDelegate a)
        {
            Console.WriteLine("==============");
            Console.WriteLine("==============");
            //中间的事情经常变化的,需要用委托来传递过来一个方法
            //判断委托是否有方法传递过来
            if (a!=null)
            {
                a.Invoke();
            }
         
            Console.WriteLine("==============");
            Console.WriteLine("==============");
        }
      在Programe中调用
     static void Main(string[] args) { Class1 my = new Class1(); //实例化这个类 my.Print(printday); //调用print方法,把你需要显示的内容的方法 传递过来 Console.ReadKey(); } //定义一个显示当前系统时间的方法 public static void printsystem() { Console.WriteLine(DateTime.Now); } //定义一个显示今天是星期几的方法 public static void printday() { Console.WriteLine(DateTime.Now.DayOfWeek); }

从上例可以看出委托一般是在一个方法中间“挖个坑” 这个坑用来执行另一个方法,而这个方法是动态的,可以根据需要调用不同的方法到里面。

 

  需求:对字符串的处理经常需要发生变化,比如在字符串两端添加“=”或“+”号把字符串字符全部转化成大写。

    public delegate string PrintDelegate(string str);   //定义返回值string 参数string类型的委托

    class Class1
    {
        //定义方法返回值无,参数字符串数组,委托方法
        public void Getstring(string [] strs,PrintDelegate weit)
        {
            //循环遍历数组
            for (int i = 0; i < strs.Length; i++)
            {
                //数组的每个下标=委托方法返回的值
                strs[i] = weit(strs[i]);
            }
        }

    
    }
 class Program
    {

        static void Main(string[] args)
        {
            //定义字符串数组
            string[] strs =  {"zhangsan","lisi","wangwu" };
            //实例化
            Class1 my = new Class1();
            //调用方法
             my.Getstring(strs, StrToupper);
            //循环输出结果
            for (int i = 0; i <strs.Length; i++)
            {
                Console.WriteLine(strs[i]);
            }
         

            Console.ReadKey();
        }

        //定义委托方法返回string类型参数string  要和委托一致
        static string set(string a)
        {
            //把string字符串前后都加上“====”
            return "===="+a + "====";

        }
        //定义委托方法把字符串转换成大写
        static string StrToupper(string str)
        {
            return str.ToUpper();
        }
    }

 


以上是关于委托基应用及系统定义的委托的主要内容,如果未能解决你的问题,请参考以下文章

委托应用及泛型委托和多播委托

事件委托(事件处理)的定义及运用

C#委托的定义 以及使用方式详解,更简单的理解委托。

C# 委托及各种写法

委托的用法及详细讲解

设计模式之代理模式(Proxy)详解及代码示例