关闭

22.1 Delegate declarations

567人阅读 评论(0) 收藏 举报
A delegate-declaration is a type-declaration (§16.5) that declares a new
delegate type.
delegate-declaration:
attributesopt delegate-modifiersopt delegate return-type identifier (
formal-parameter-listopt ) ;
delegate-modifiers:
delegate-modifier
delegate-modifiers delegate-modifier
delegate-modifier:
new
public
protected
internal
private
It is a compile-time error for the same modifier to appear multiple times
in a delegate declaration.
The new modifier is only permitted on delegates declared within another
type, in which case it specifies that such
a delegate hides an inherited member by the same name, as described in §17.2
.2.
The public, protected, internal, and private modifiers control the
accessibility of the delegate type.
Depending on the context in which the delegate declaration occurs, some of
these modifiers may not be permitted
(§10.5.1).
The delegate?s type name is identifier.
The optional formal-parameter-list specifies the parameters of the
delegate, and return-type indicates the return
type of the delegate. A method and a delegate type are compatible if both
of the following are true:
? They have the same number or parameters, with the same types, in the same
order, with the same parameter
modifiers.
? Their return-types are the same.
Delegate types in C# are name equivalent, not structurally equivalent.
[Note: However, instances of two distinct
but structurally equivalent delegate types may compare as equal (§14.9.8).
end note] Specifically, two different
delegate types that have the same parameter lists and return type are
considered different delegate types.
[Example: For example:
C# LANGUAGE SPECIFICATION
298
delegate int D1(int i, double d);
class A
{
public static int M1(int a, double b) {?}
}
class B
{
delegate int D2(int c, double d);
public static int M1(int f, double g) {?}
public static void M2(int k, double l) {?}
public static int M3(int g) {?}
public static void M4(int g) {?}
}
The delegate types D1 and D2 are both compatible with the methods A.M1 and
B.M1, since they have the same
return type and parameter list; however, these delegate types are two
different types, so they are not
interchangeable. The delegate types D1 and D2 are incompatible with the
methods B.M2, B.M3, and B.M4, since
they have different return types or parameter lists. end example]
The only way to declare a delegate type is via a delegate-declaration. A
delegate type is a class type that is
derived from System.Delegate. Delegate types are implicitly sealed, so it
is not permissible to derive any
type from a delegate type. It is also not permissible to derive a
non-delegate class type from System.Delegate.
System.Delegate is not itself a delegate type; it is a class type from
which all delegate types are derived.
C# provides special syntax for delegate instantiation and invocation.
Except for instantiation, any operation that
can be applied to a class or class instance can also be applied to a
delegate class or instance, respectively. In
particular, it is possible to access members of the System.Delegate type
via the usual member access syntax.
The set of methods encapsulated by a delegate instance is called an
invocation list. When a delegate instance is
created (§22.2) from a single method, it encapsulates that method, and its
invocation list contains only one entry.
However, when two non-null delegate instances are combined, their
invocation lists are concatenated?in the
order left operand then right operand?to form a new invocation list, which
contains two or more entries.
Delegates are combined using the binary + (§14.7.4) and += operators (§14.1
3.2). A delegate can be removed
from a combination of delegates, using the binary - (§14.7.5) and -=
operators (§14.13.2). Delegates can be
compared for equality (§14.9.8).
[Example: The following example shows the instantiation of a number of
delegates, and their corresponding
invocation lists:
delegate void D(int x);
class Test
{
public static void M1(int i) {?}
public static void M2(int i) {?}
}
class Demo
{
static void Main() {
D cd1 = new D(Test.M1); // M1
D cd2 = new D(Test.M2); // m2
D cd3 = cd1 + cd2; // M1 + M2
D cd4 = cd3 + cd1; // M1 + M2 + M1
D cd5 = cd4 + cd3; // M1 + M2 + M1 + M1 + M2
}
}
When cd1 and cd2 are instantiated, they each encapsulate one method. When
cd3 is instantiated, it has an
invocation list of two methods, M1 and M2, in that order. cd4?s invocation
list contains M1, M2, and M1, in that
order. Finally, cd5?s invocation list contains M1, M2, M1, M1, and M2, in
that order.
For more examples of combining (as well as removing) delegates, see §22.3.
end example]
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:566087次
    • 积分:11486
    • 等级:
    • 排名:第1344名
    • 原创:565篇
    • 转载:0篇
    • 译文:0篇
    • 评论:50条
    文章分类