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

C# 委托(一)

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

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

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

  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# 委托(一)” 的相关文章

函数重名:构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。

函数重名:构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。

构成重载的条件:参数类型不同或者参数个数不同(不严谨),与返回值无关。        static void Main(string[] args)//默认函数   &...

异常与异常处理

异常与异常处理

传统的错误表示方式:错误码。举例。需要知道不同错误码的含义,如果不处理错误码,则程序可能陷入不可以预置的错误。陈摄影师以为文件已经被删除造成的麻烦。错误码的缺点:不处理则很难发现,每次处理则很麻烦;难以看出错误的原因;容易使得程序进入不确定状态。try catch。Exception ex 异常也是...

静态成员和静态类

静态成员和静态类

全局变量。static类变量。不用new就能用的方法:static方法,static方法其实就是普通函数在static方法中可以调用其他static成员,但是不能调用非static成员。在非static方法中可以调用static成员。    class&nbs...

索引器

索引器

C#中提供了按照索引器进行访问的方法定义索引器的方式:string this[int index]{get { return ""; }set { }},string为索引器的类型,[]中是参数列表。进行索引器写操作就是调用set代码块,在set内部使用value得到用户设置的值...

发表评论

访客

看不清,换一张

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