22.1 Delegate declarations

原创 2006年06月22日 03:19:00
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]

Placing const in Declarations by Dan Saks

  • 2009年02月17日 14:03
  • 30KB
  • 下载

Objective-C,ios,属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter

属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter...

Static class declarations

Q: Can a class (whether an inner or outer class) be declared static? A: In order to understand the ...
  • errizh
  • errizh
  • 2017年02月22日 14:22
  • 92

ice slice Forward Declarations

 Both interfaces and classes can be forward declared. Forward declarations permit the creatio...

Item9 Prefer alias declarations to typedefs

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中引入的std::uniq...

FFMPEG deprecated 属性与is deprecated [-Wdeprecated-declarations] 警告

阅读ffmpeg源码是 发现一些函数前面加了 attribute_deprecated 属性;如:attribute_deprecated int url_fopen( AVIOContext **s...

ABAP 7.4新特性(一):行内定义 Inline Declarations

以前我们要用一个变量的时候,需要在使用语句的前面先定义。现在,可以在使用的时候就定义了。 比如说我们经常要预先定义表的工作区,然后在loop时使用。现在可以在loop的时候就定义对于表的工作区了。 以...

学习笔记一:命名空间(namespace)之四:using declarations和using directives的区别

(本文主要参考c++ primer第17章2.4节内容。) 由前面内容,我们知道c++引入命名空间(namespace)概念的主要目的是避免命名冲突。但是当我们想要引用命名空间成员时,我们就会体会到...

<Effective Mordern C++>笔记:Item 9:prefer alias declarations to typedefs.

转载自原博:原博 C++11中引入的std::unique_ptr智能指针是个好用的东西,在我们使用unique_ptr的时候往往会写出这样的类型std::uniqeu_ptr,看上去很臃肿,因此大多...
  • cqk0100
  • cqk0100
  • 2017年05月11日 19:43
  • 150

算法导论-第22章-基本的图算法-22.1 图的表示

一、综述 图的表示方法通常有两种,即邻接表表示法和邻接矩阵表示法。这两种方法都可以表示有向图和无向图 1.邻接表表示法 (1)用邻接表表示无向图 (2)用邻接表表示有向...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:22.1 Delegate declarations
举报原因:
原因补充:

(最多只允许输入30个字)