在C#中使用关键字delegate来声明委托,具体格式如下:
其中,委托的修饰符包括访问修饰符和new,不能在同一个委托内多次使用同一个修饰符。修饰符new用于隐藏从基类继承而来的同名委托。public、protected、internal和private用于控制委托类型的可访问性,但是根据具体的需要可能不允许使用某修饰符。
因为C#委托名是一种标识符,所以需要遵循标识符的命名规则,并且最好能体现出委托的含义和用途。
形参是可选的,用来指定委托的参数。返回类型用于设置委托的返回类型。
如果一个方法和某委托相兼容,则这个方法必须具备如下两个条件。
1)两者具有相同的签名,即具有相同的参数数量,并且类型、顺序和参数修饰符也相同。
2)两者返回类型相同。
看下面的一段代码:
在上述代码中,声明了一个Int类型的委托weituo,并且包含了Object类型的参数mm,int类型的参数i。上述委托可以和下面代码中的方法chuli()相兼容:
在C#中,即使两个委托的名字相同,但是如果结构不同,则这两个委托也不是同一个委托。看下面的一段代码:
在上述代码中,委托A1和A2都会和类class1的方法chuli1()和类class2的方法chuli1()相兼容,因为它们具有相同的返回类型和参数列表。但是委托A1和A2不会被认为是相同的,并且不能互换。而委托A1和A2都不会和类class2内的方法chuli2()、chuli3()和chuli4()相兼容,因为它们的返回类型和参数不同。(www.xing528.com)
注意
对于结构相同的委托在实例进行比较时,可以被认为是相等的关系。通过使用“==”和“!=”重载运算符,可以直接对委托实例进行比较。例如下面的代码:
委托的类型是从System.Delegate类派生来的类型,被隐含为封闭的。在C#中,不允许从一个委托类中派生出其他的类型,也不允许从System.Delegate派生出非委托类的类型。
通过委托创建实例后,这个实例就封装了一个调用列表,在这个列表中包含了一个或多个方法。在此委托实例中存储了对调用列表中各个方法的引用,所以用合适的参数来调用委托的实例,和用这个参数集来顺序调用列表中的方法是等效的。看下面的一段代码:
当编译器处理上面的委托声明时,将会在其中定义一个如下格式的类:
在声明一个委托时,可以在任何位置(包括命名空间、类和编译单元等里面)。声明这个委托,
C#通过使用关键字new来创建一个委托实例,具体格式如下:
委托名实例名=new委托名(参数);
如果委托实例的参数是一个方法,则标识的方法既可以是实例方法,也可以是静态方法,但是必须确保方法和委托相兼容。如果委托实例的参数是委托名,则设置实例创建委托副本。例如:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。