Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C-sharp language specification.2004.pdf
Скачиваний:
14
Добавлен:
23.08.2013
Размер:
2.55 Mб
Скачать

C# LANGUAGE SPECIFICATION

1An abstract event declaration specifies that the accessors of the event are virtual, but does not provide an

2actual implementation of the accessors. Instead, non-abstract derived classes are required to provide their

3own implementation for the accessors by overriding the event. Because an accessor for an abstract event

4declaration provides no actual implementation, its accessor-body simply consists of a semicolon.

5An event declaration that includes both the abstract and override modifiers specifies that the event is

6abstract and overrides a base event. The accessors of such an event are also abstract.

7Abstract event declarations are only permitted in abstract classes (§17.1.1.1).

8The accessors of an inherited virtual event can be overridden in a derived class by including an event

9declaration that specifies an override modifier. This is known as an overriding event declaration. An

10overriding event declaration does not declare a new event. Instead, it simply specializes the implementations

11of the accessors of an existing virtual event.

12An overriding event declaration shall specify the exact same accessibility modifiers, type, and name as the

13overridden event.

14An overriding event declaration can include the sealed modifier. Use of this modifier prevents a derived

15class from further overriding the event. The accessors of a sealed event are also sealed.

16It is a compile-time error for an overriding event declaration to include a new modifier.

17Except for differences in declaration and invocation syntax, virtual, sealed, override, and abstract accessors

18behave exactly like virtual, sealed, override and abstract methods. Specifically, the rules described in

19§17.5.3, §17.5.4, §17.5.5, and §17.5.6 apply as if accessors were methods of a corresponding form. Each

20accessor corresponds to a method with a single value parameter of the event type, a void return type, and

21the same modifiers as the containing event.

2217.8 Indexers

23An indexer is a member that enables an object to be indexed similar to an array. Indexers are declared using

24indexer-declarations:

25indexer-declaration:

26

attributesopt indexer-modifiersopt indexer-declarator { accessor-declarations }

27

indexer-modifiers:

28

indexer-modifier

29

indexer-modifiers indexer-modifier

30

indexer-modifier:

31

new

32

public

33

protected

34

internal

35

private

36

virtual

37

sealed

38

override

39

abstract

40extern

41indexer-declarator:

42

type

this [ formal-parameter-list ]

43

type

interface-type . this [ formal-parameter-list ]

44An indexer-declaration can include a set of attributes (§24) and a valid combination of the four access

45modifiers (§17.2.3), the new (§17.2.2), virtual (§17.5.3), override (§17.5.4), sealed (§17.5.5),

46abstract (§17.5.6), and extern (§17.5.7) modifiers.

304

Chapter 17 Classes

1Indexer declarations are subject to the same rules as method declarations (§17.5) with regard to valid

2combinations of modifiers, with the one exception being that the static modifier is not permitted on an

3indexer declaration.

4The modifiers virtual, override, and abstract are mutually exclusive except in one case. The

5abstract and override modifiers can be used together so that an abstract indexer can override a virtual

6one.

7The type of an indexer declaration specifies the element type of the indexer introduced by the declaration.

8Unless the indexer is an explicit interface member implementation, the type is followed by the keyword

9this. For an explicit interface member implementation, the type is followed by an interface-type, a “.”, and

10the keyword this. Unlike other members, indexers do not have user-defined names.

11The formal-parameter-list specifies the parameters of the indexer. The formal parameter list of an indexer

12corresponds to that of a method (§17.5.1), except that at least one parameter shall be specified, and that the

13ref and out parameter modifiers are not permitted.

14The type of an indexer and each of the types referenced in the formal-parameter-list shall be at least as

15accessible as the indexer itself (§10.5.4).

16The accessor-declarations (§17.6.2), which shall be enclosed in “{” and “}” tokens, declare the accessors

17of the indexer. The accessors specify the executable statements associated with reading and writing indexer

18elements.

19Even though the syntax for accessing an indexer element is the same as that for an array element, an indexer

20element is not classified as a variable. Thus, it is not possible to pass an indexer element as a ref or out

21argument.

22The formal-parameter-list of an indexer defines the signature (§10.6) of the indexer. Specifically, the

23signature of an indexer consists of the number and types of its formal parameters. The element type and

24names of the formal parameters are not part of an indexer’s signature.

25The signature of an indexer shall differ from the signatures of all other indexers declared in the same class.

26Indexers and properties are very similar in concept, but differ in the following ways:

27A property is identified by its name, whereas an indexer is identified by its signature.

28A property is accessed through a simple-name (§14.5.2) or a member-access (§14.5.4), whereas an

29indexer element is accessed through an element-access (§14.5.6.2).

30A property can be a static member, whereas an indexer is always an instance member.

31A get accessor of a property corresponds to a method with no parameters, whereas a get accessor of an

32indexer corresponds to a method with the same formal parameter list as the indexer.

33A set accessor of a property corresponds to a method with a single parameter named value, whereas a

34set accessor of an indexer corresponds to a method with the same formal parameter list as the indexer,

35plus an additional parameter named value.

36It is a compile-time error for an indexer accessor to declare a local variable or local constant with the

37same name as an indexer parameter.

38In an overriding property declaration, the inherited property is accessed using the syntax base.P, where

39P is the property name. In an overriding indexer declaration, the inherited indexer is accessed using the

40syntax base[E], where E is a comma-separated list of expressions.

41Aside from these differences, all rules defined in §17.6.2 and §17.6.3 apply to indexer accessors as well as to

42property accessors.

43When an indexer declaration includes an extern modifier, the indexer is said to be an external indexer.

44Because an external indexer declaration provides no actual implementation, each of its accessor-

45declarations consists of a semicolon.

305

C# LANGUAGE SPECIFICATION

1[Example: The example below declares a BitArray class that implements an indexer for accessing the

2individual bits in the bit array.

3using System;

4class BitArray

5{

6

int[] bits;

7

int length;

8

public BitArray(int length) {

9

if (length < 0) throw new ArgumentException();

10

bits = new int[((length - 1) >> 5) + 1];

11

this.length = length;

12

}

13

public int Length {

14

get { return length; }

15

}

16

public bool this[int index] {

17

get {

18

if (index < 0 || index >= length) {

19

throw new IndexOutOfRangeException();

20

}

21

return (bits[index >> 5] & 1 << index) != 0;

22

}

23

set {

24

if (index < 0 || index >= length) {

25

throw new IndexOutOfRangeException();

26

}

27

if (value) {

28

bits[index >> 5] |= 1 << index;

29

}

30

else {

31

bits[index >> 5] &= ~(1 << index);

32

}

33

}

34}

35}

36An instance of the BitArray class consumes substantially less memory than a corresponding bool[]

37(since each value of the former occupies only one bit instead of the latter’s one byte), but it permits the same

38operations as a bool[].

39The following CountPrimes class uses a BitArray and the classical “sieve” algorithm to compute the

40number of primes between 2 and a given maximum:

41class CountPrimes

42{

43

static int Count(int max) {

44

BitArray flags = new BitArray(max + 1);

45

int count = 0;

46

for (int i = 2; i <= max; i++) {

47

if (!flags[i]) {

48

for (int j = i * 2; j <= max; j += i) flags[j] = true;

49

count++;

50

}

51

}

52

return count;

53

}

54

static void Main(string[] args) {

55

int max = int.Parse(args[0]);

56

int count = Count(max);

57

Console.WriteLine(

58

"Found {0} primes between 2 and {1}", count, max);

59}

60}

306

Соседние файлы в предмете Электротехника