C#委托一——委托初解

PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处:

今天一直在研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合《C#与.NET4高级程序设计》、MSDN、借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚(在我弄懂之前网上的感觉都很模糊)

namespace DelegateDemo
{
    //function1:
    public delegate int setMyName(string name);     //委托类型
    //function2:
    class MyClass
    {
        public delegate int setMyName2(string name);
        public setMyName mermber;               //委托类型成员
    }
    //function3
    class MyClass2
    {
        public delegate int setMyName3(string name);
        private setMyName3 mermber2;
        //注册函数
        public MyClass2(setMyName3 fun,string name)
        {
            mermber2 = fun;

            if (null != mermber2)
            {
                mermber2(name);
            }
        }
    }

    class Program
    {

        //要调用的方法
        public static int GetMyName(string name)
        {
            Console.WriteLine("My Name Is {0}",name);
            return 1;
        }

        static void Main(string[] args)
        {
            //function1:
            setMyName setName = new setMyName(GetMyName);
            setName("Function1:婴儿");

            //function2:
            MyClass setName2 = new MyClass();
            setName2.mermber = GetMyName;
            setName2.mermber("Function2:青少年");

            //function3:
            MyClass2 setName3 = new MyClass2(GetMyName, "Function3:中年");

            //function3(other):
            MyClass2 setName4 = new MyClass2(new MyClass2.setMyName3(GetMyName), "Function4:老年");

            //支持多路广播(维护一个可调用方法列表,顺序调用列表中的委托)
            //+=合并(简写) -=注销
            setMyName multicast = null;

            multicast += (setName2.mermber);

            //演示合并需要两个……为了不破坏function3的封装性建setName5
            setMyName setName5 = GetMyName;

            multicast += setName5;  //合并的是两个委托类型对象的成员

            multicast("合并的是两个委托类型对象的成员:迟暮");

            multicast += GetMyName;
            multicast += GetMyName;

            multicast("合并的是两个调用的方法:耄耋");    //合并的是两个调用的方法(更能表现出委托类型或者是成员都是一个地址)

            Console.ReadLine();

        }
    }
}

//方法一:定义委托类型

//        new委托对象(传入要调用的方法名)

//        对象();

//方法二:定义委托类型

//        定义该委托类型的成员变量(public)

//        该成员变量 = 调用的方法

//        成员变量();

//方法三:定义委托类型

//        定义该委托类型的成员变量(private)

//        写一个注册函数(参数:委托类型)

//        调用该注册函数(传入要调用的方法)-----------两种传入方式:<1>要调用方法的名字                                      ||

//                                                                   <2>new委托类型所在的类点出委托类型(要调用的方法)         ||运行结果相同

//                                                                      例如:  new Car.CarEngineHandler(OnCarEngineEvent)    ||

//        调用该类另一个辅助函数:功能 1:判断委托的成员变量是否为null

//                                     2. 使用委托的成员变量();

//备注1:所谓的注册函数就是一个普通函数,目的是为了封装委托

//备注2:在方法一中第二步骤的参数------------------------------------两种方式:||<1>要调用的方法是static可直接传入该方法的名字

//                                                                             ||<2>不是static则传入该方法所在类的实体对象.该方法名

//备注3:按照方法三将委托定义在使用它的类中是一种很普遍的做法

//备注4:方法三中第一种传入方式叫做---方法组转换语法(不需要委托对象直接传入方法名)------ -----C#2.0后的新语法





时间: 2024-10-06 21:27:47

C#委托一——委托初解的相关文章

C# 委托之把委托从委托链(多播委托)移除

运用“-”运算符将委托从委托链移除 1 class HelloWorld 2 { 3 //定义委托类型 4 delegate void DelegationChain(); 5 static void Main(string[] args) 6 { 7 //用静态方法来实例委托 8 DelegationChain mydelegateone=new DelegationChain(HelloWorld.Fun2); 9 //用实例方法来实例委托 10 DelegationChain mydele

初识C#委托及委托链

委托是c#很重要的特性.代码如下: class Program { public delegate void DelegateTest(); static void Main(string[] args) { DelegateTest dtstatic = new DelegateTest(Program.method1);//实例化,静态方法,不用new DelegateTest dtinstance = new DelegateTest(new Program().method2);//实例

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

【C#进阶】多播委托和委托数组像是一回事~

这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { public static void MultiplyByTwo(double value) { Console.WriteLine( "2* {0} = {1}",value,value * 2); } public static void Square(double value) { Conso

委托, 泛型委托,Func&lt;T&gt;和Action&lt;T&gt;

使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyDelegate(); class Program { static void Main(string[] args) { MyDelegate d = ReturnOne; d += ReturnTwo; foreach (int i in GetAllReturnVals(d)) { Consol

分配委托、匿名委托、委托

分配委托(将命名方法分配给其委托) using System; public class GenericFunc { public static void Main() { // Instantiate delegate to reference UppercaseString method Func<string, string> convertMethod = UppercaseString; string name = "Dakota"; // Use delegat

C# 匿名方法 委托 Action委托 Delegate委托

原文地址:https://msdn.microsoft.com/zh-cn/library/bb882516.aspx 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式. 实例参考: 1 using System; 2 using System.Collection

委托Delegate,多播委托和委托链

定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static CalculateDelegate mydelegate; 定义一个方法和委托绑定,注意定义的方法和委托的参数要统一 public static void Add(int 32 x,int 32 y) { console.writeline(x+y); } 将方法和委托绑定 public static void m

委托和委托链

1.委托是一种类型,声明一个委托的时候有点像创建一个方法,我们下面两个例子都用的委托,代码如下,eg: public delegate int MyDelegate1(int i); 示例代码,eg: 1 public Form3() 2 { 3 InitializeComponent(); 4 } 5 public int F1(int i) 6 { 7 return 1; 8 } 9 public int F2(int i) 10 { 11 return 2; 12 } 13 public