当前位置:首页 > C#学习 > 正文内容

C# 委托(一)

小道6年前 (2018-11-03)C#学习2606

委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。

可以通过以下操作步骤来使用委托。

  1. 声明一个委托类型,委托声明看上去和方法声明相似,只是没有实现块。

  2. 使用该委托类型声明一个委托变量。

  3. 创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。

  4. 你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。

  5. 在代码中你可以像调用方法一样调用委托。在调用委托的时候,其包含的每一个方法都会被执行。


C# 中通过委托静态方法:

using System;
namespace 委托
{
    delegate int Wt(int x); //声明委托类型
    class Program
    {
        public static int num = 1;//声明一个全局静态 整型变量,并赋值为 1
        static void Main(string[] args)
        {
            Wt d = new Wt(F);//声明委托变量
            d(10);//执行委托
            Console.WriteLine("num的值为: {0}",num);//输出num的值
            Console.ReadKey();//按任意键
        }
        public static int F(int i) //全局静态方法
        {
            num += i;// num = num + 1
            return num;// 返回num的值
        } 
    }
}

输出结果:

image.png


C# 中通过委托实例化方法:

using System;

namespace 委托1
{
    delegate int Wt(int x);//声明委托类型
    class Program
    {
        static void Main(string[] args)
        {
            L c = new L(); //实例化L类
            Wt d = new Wt(c.F);//声明委托变量
            d(10);//执行委托
            Console.WriteLine("c.num的值为: {0}", c.num);//输出num的值
            Console.ReadKey();//按任意键
        }
    }
    class L //类
    {
        public int num = 1; // 全局字段
        public int F(int i) //全局方法
        {
            num += i; //num = num + i。
            return num;//返回num的值。
        }
    }
}

输出结果:

image.png


委托可以使用额外的运算符来“组合”。这个运算符最终会创建一个新的委托,其调用列表连接了作为操作数的两个委托的调用列表副本。

尽管术语 组合委托 让我们觉得好像操作数委托被修改了,其实它们并没有被修改。事实上,委托是恒定的。委托对象被创建后不能被改变。

可以使用+=运算符为委托添加方法。

可以使用-=运算符从委托移除方法。


组合委托:

using System;

namespace 组合委托
{
    delegate void Wt(int x);//声明委托类型
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(" d1(1) 输出结果:");
            Wt d1 = new Wt(C.A1);//声明委托对象
            d1(1);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d2(2) 输出结果:");
            Wt d2 = new Wt(C.A2);//声明委托对象
            d2(2);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d3(3) 输出结果:");
            C c = new C();//实例化类的对象
            Wt d3 = new Wt(c.A3);//声明委托对象
            d3(3);//执行委托

            Console.WriteLine("————————");

            Console.WriteLine(" d4(4) 输出结果:");
            Wt d4 = d1 + d2 + d3; //声明委托对象 并初始化
            d4(4);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d4(40) 输出结果:");
            d4 += d1;//声明委托对象 并增加方法
            d4(40);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d4(400) 输出结果:");
            d4 -= d1;//声明委托对象 并移除方法
            d4(400);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d4(4000) 输出结果:");
            d4 -= d2;//声明委托对象 并移除方法
            d4 -= d1;//声明委托对象 并移除方法
            d4(4000);//执行委托
            Console.WriteLine("————————");

            Console.WriteLine(" d4(4000) 输出结果:");
            if ((d4 -= d3) == null)//判断当前d4 中是否还有方法。当d4中没有方法 则为 null
            {
                Console.WriteLine("目前d4列表内为 null ");//输出
            }
            else
            {
                d4(40000);//执行委托
            }
            Console.WriteLine("————————");
            Console.ReadKey();
        }
    }
    class C //类
    {
        public static void A1(int i)//全局静态方法
        {
            Console.WriteLine("A1的值为:"+ i);//输出
        }
        public static void A2(int i)//全局静态方法
        {
            Console.WriteLine("A2的值为:" + i);//输出
        }
        public void A3(int i)//全局方法
        {
            Console.WriteLine("A3的值为:" + i);//输出
        }
    }
}

输出结果:

image.png

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://www.daobk.com/post/110.html

分享给朋友:

“C# 委托(一)” 的相关文章

Switch语句:输入一个数字,用Switch判断,并输出。

Switch语句:输入一个数字,用Switch判断,并输出。

Switch语句:输入一个数字,用Switch判断,并输出。            Console.WriteLine("输入一个数:");//提示用户输入一个...

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。            Console.WriteLine("...

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

string[] Split(params char[] separator):将字符串按照指定的分割符分割为字符串数组;string[] Split(char[] separator, StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组( opt...

面向对象版聊天机器人

面向对象版聊天机器人

机器人有不同的名字、维护自己的FullLevel,可以SayHello(我叫***),可以喂食(Eat(int foodCount)),可以对它说话(Speak),对异常情况(错误的喂饭数字,喂的太多撑死了)进行处理,有两个机器人供选择,一开始通过1、2数字选择聊天机器人。  &...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。