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

C# 委托(一)

小道7年前 (2018-11-03)C#学习4289

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

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

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

构造函数

构造函数

构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数是用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用。构造函数可以有参数,new对象的时候传递函数参数即可构造函数可以重载,也就是有多个参数不同的构造函数。如果不指定构造函数,则类有一个默认的无参构造函数。如果指...

常量

常量

const常量。常量名要大写。一定不会变化的值才能声明为常量。常量一旦声明,下面就不可更改(再赋值)。    class Program     {     &nbs...

图片的显示和隐藏

图片的显示和隐藏

页面上有一张图片(PictureBox,在Image属性中加载图片),默认是隐藏的(Visible=False),用户在文本框中输入身份证号(131226198105223452),点击按钮,如果年龄大于18岁则显示图(Visible=True),否则提示年龄太小。取当前年份:DateTime.No...

修改密码

修改密码

修改密码。界面上有旧密码、新密码、重复新密码,假设旧密码为888888,两次输入的新密码必须和旧密码不一样,并且两次输入的新密码必须一致。        private void button1_Cl...