C# 委托(一)

原创 小道  2018-11-03 18:10:04  阅读 552 次 评论 0 条
摘要:

委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。可以通过以下操作步骤来使用委托。声明一个委托类型,委托声明看上去和方法声明相似,只是没有实现块。使用该委托类型声明一个委托变量。创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。在代码中你可以像调用方法一样调用委托。在调

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

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

  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
版权声明:本文为原创文章,版权归 小道 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?