Table of Contents
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
v
4.2.1 Class types 66
4.2.2 The object type 66
4.2.3 The string type 66
4.2.4 Interface types 67
4.2.5 Array types 67
4.2.6 Delegate types 67
4.3 Boxing and unboxing 67
4.3.1 Boxing conversions 67
4.3.2 Unboxing conversions 68
5. Variables 69
5.1 Variable categories 69
5.1.1 Static variables 69
5.1.2 Instance variables 69
5.1.2.1 Instance variables in classes 69
5.1.2.2 Instance variables in structs 70
5.1.3 Array elements 70
5.1.4 Value parameters 70
5.1.5 Reference parameters 70
5.1.6 Output parameters 70
5.1.7 Local variables 71
5.2 Default values 71
5.3 Definite assignment 71
5.3.1 Initially assigned variables 74
5.3.2 Initially unassigned variables 74
5.4 Variable references 74
6. Conversions 75
6.1 Implicit conversions 75
6.1.1 Identity conversion 75
6.1.2 Implicit numeric conversions 75
6.1.3 Implicit enumeration conversions 76
6.1.4 Implicit reference conversions 76
6.1.5 Boxing conversions 76
6.1.6 Implicit constant expression conversions 76
6.1.7 User-defined implicit conversions 77
6.2 Explicit conversions 77
6.2.1 Explicit numeric conversions 77
6.2.2 Explicit enumeration conversions 78
6.2.3 Explicit reference conversions 78
6.2.4 Unboxing conversions 79
6.2.5 User-defined explicit conversions 79
6.3 Standard conversions 79
6.3.1 Standard implicit conversions 79
6.3.2 Standard explicit conversions 80
6.4 User-defined conversions 80
6.4.1 Permitted user-defined conversions 80
6.4.2 Evaluation of user-defined conversions 80
6.4.3 User-defined implicit conversions 81
6.4.4 User-defined explicit conversions 82
7. Expressions 83
C# LANGUAGE REFERENCE
vi
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
7.1 Expression classifications 83
7.1.1 Values of expressions 84
7.2 Operators 84
7.2.1 Operator precedence and associativity 84
7.2.2 Operator overloading 85
7.2.3 Unary operator overload resolution 86
7.2.4 Binary operator overload resolution 87
7.2.5 Candidate user-defined operators 87
7.2.6 Numeric promotions 87
7.2.6.1 Unary numeric promotions 88
7.2.6.2 Binary numeric promotions 88
7.3 Member lookup 88
7.3.1 Base types 89
7.4 Function members 89
7.4.1 Argument lists 91
7.4.2 Overload resolution 93
7.4.2.1 Applicable function member 93
7.4.2.2 Better function member 94
7.4.2.3 Better conversion 94
7.4.3 Function member invocation 94
7.4.3.1 Invocations on boxed instances 95
7.4.4 Virtual function member lookup 96
7.4.5 Interface function member lookup 96
7.5 Primary expressions 96
7.5.1 Literals 96
7.5.2 Simple names 96
7.5.2.1 Invariant meaning in blocks 97
7.5.3 Parenthesized expressions 98
7.5.4 Member access 98
7.5.4.1 Identical simple names and type names 100
7.5.5 Invocation expressions 100
7.5.5.1 Method invocations 101
7.5.5.2 Delegate invocations 101
7.5.6 Element access 102
7.5.6.1 Array access 102
7.5.6.2 Indexer access 103
7.5.6.3 String indexing 103
7.5.7 This access 103
7.5.8 Base access 104
7.5.9 Postfix increment and decrement operators 104
7.5.10 new operator 105
7.5.10.1 Object creation expressions 106
7.5.10.2 Array creation expressions 107
7.5.10.3 Delegate creation expressions 108
7.5.11 typeof
operator 110
7.5.12 sizeof
operator 110
7.5.13 checked
and
unchecked
operators 110
7.6 Unary expressions 113
7.6.1 Unary plus operator 113
7.6.2 Unary minus operator 113
7.6.3 Logical negation operator 114
Table of Contents
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
vii
7.6.4 Bitwise complement operator 114
7.6.5 Indirection operator 114
7.6.6 Address operator 114
7.6.7 Prefix increment and decrement operators 114
7.6.8 Cast expressions 115
7.7 Arithmetic operators 116
7.7.1 Multiplication operator 116
7.7.2 Division operator 117
7.7.3 Remainder operator 118
7.7.4 Addition operator 119
7.7.5 Subtraction operator 120
7.8 Shift operators 121
7.9 Relational operators 123
7.9.1 Integer comparison operators 123
7.9.2 Floating-point comparison operators 124
7.9.3 Decimal comparison operators 125
7.9.4 Boolean equality operators 125
7.9.5 Enumeration comparison operators 125
7.9.6 Reference type equality operators 125
7.9.7 String equality operators 127
7.9.8 Delegate equality operators 127
7.9.9 The is operator 127
7.10 Logical operators 127
7.10.1 Integer logical operators 128
7.10.2 Enumeration logical operators 128
7.10.3 Boolean logical operators 128
7.11 Conditional logical operators 129
7.11.1 Boolean conditional logical operators 129
7.11.2 User-defined conditional logical operators 129
7.12 Conditional operator 130
7.13 Assignment operators 131
7.13.1 Simple assignment 131
7.13.2 Compound assignment 133
7.13.3 Event assignment 134
7.14 Expression 134
7.15 Constant expressions 134
7.16 Boolean expressions 135
8. Statements 137
8.1 End points and reachability 137
8.2 Blocks 139
8.2.1 Statement lists 139
8.3 The empty statement 139
8.4 Labeled statements 140
8.5 Declaration statements 140
8.5.1 Local variable declarations 140
8.5.2 Local constant declarations 141
8.6 Expression statements 142
8.7 Selection statements 142
8.7.1 The if statement 142
8.7.2 The switch statement 143
C# LANGUAGE REFERENCE
viii
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
8.8 Iteration statements 147
8.8.1 The while statement 147
8.8.2 The do statement 147
8.8.3 The for statement 148
8.8.4 The
foreach
statement 149
8.9 Jump statements 150
8.9.1 The break statement 151
8.9.2 The continue statement 151
8.9.3 The
goto statement 152
8.9.4 The return statement 153
8.9.5 The throw statement 153
8.10 The try statement 154
8.11 The checked and unchecked statements 156
8.12 The lock statement 157
9. Namespaces 159
9.1 Compilation units 159
9.2 Namespace declarations 159
9.3 Using directives 160
9.3.1 Using alias directives 161
9.3.2 Using namespace directives 163
9.4 Namespace members 165
9.5 Type declarations 165
10. Classes 167
10.1 Class declarations 167
10.1.1 Class modifiers 167
10.1.1.1 Abstract classes 167
10.1.1.2 Sealed classes 168
10.1.2 Class base specification 168
10.1.2.1 Base classes 168
10.1.2.2 Interface implementations 170
10.1.3 Class body 170
10.2 Class members 170
10.2.1 Inheritance 171
10.2.2 The new modifier 171
10.2.3 Access modifiers 172
10.2.4 Constituent types 172
10.2.5 Static and instance members 172
10.2.6 Nested types 173
10.3 Constants 173
10.4 Fields 175
10.4.1 Static and instance fields 176
10.4.2 Readonly fields 176
10.4.2.1 Using static readonly fields for constants 176
10.4.2.2 Versioning of constants and static readonly fields 177
10.4.3 Field initialization 177
10.4.4 Variable initializers 178
10.4.4.1 Static field initialization 179
10.4.4.2 Instance field initialization 179
10.5 Methods 179
Table of Contents
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
ix
10.5.1 Method parameters 180
10.5.1.1 Value parameters 181
10.5.1.2 Reference parameters 181
10.5.1.3 Output parameters 182
10.5.1.4 Params parameters 183
10.5.2 Static and instance methods 184
10.5.3 Virtual methods 185
10.5.4 Override methods 187
10.5.5 Abstract methods 189
10.5.6 External methods 190
10.5.7 Method body 190
10.5.8 Method overloading 191
10.6 Properties 191
10.6.1 Static properties 192
10.6.2 Accessors 192
10.6.3 Virtual, override, and abstract accessors 197
10.7 Events 199
10.8 Indexers 202
10.8.1 Indexer overloading 205
10.9 Operators 205
10.9.1 Unary operators 206
10.9.2 Binary operators 206
10.9.3 Conversion operators 206
10.10 Instance constructors 208
10.10.1 Constructor initializers 209
10.10.2 Instance variable initializers 209
10.10.3 Constructor execution 209
10.10.4 Default constructors 211
10.10.5 Private constructors 212
10.10.6 Optional constructor parameters 212
10.11 Destructors 212
10.12 Static constructors 213
10.12.1 Class loading and initialization 215
11. Structs 217
11.1 Struct declarations 217
11.1.1 Struct modifiers 217
11.1.2 Interfaces 217
11.1.3 Struct body 217
11.2 Struct members 217
11.3 Struct examples 217
11.3.1 Database integer type 217
11.3.2 Database boolean type 219
12. Arrays 223
12.1 Array types 223
12.1.1 The
System.Array
type 224
12.2 Array creation 224
12.3 Array element access 224
12.4 Array members 224
12.5 Array covariance 224
C# LANGUAGE REFERENCE
x
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
12.6 Array initializers 225
13. Interfaces 227
13.1 Interface declarations 227
13.1.1 Interface modifiers 227
13.1.2 Base interfaces 227
13.1.3 Interface body 228
13.2 Interface members 228
13.2.1 Interface methods 229
13.2.2 Interface properties 229
13.2.3 Interface events 230
13.2.4 Interface indexers 230
13.2.5 Interface member access 230
13.3 Fully qualified interface member names 232
13.4 Interface implementations 232
13.4.1 Explicit interface member implementations 233
13.4.2 Interface mapping 235
13.4.3 Interface implementation inheritance 238
13.4.4 Interface re-implementation 239
13.4.5 Abstract classes and interfaces 241
14. Enums 243
14.1 Enum declarations 243
14.2 Enum members 244
14.3 Enum values and operations 246
15. Delegates 247
15.1 Delegate declarations 247
15.1.1 Delegate modifiers 247
16. Exceptions 249
17. Attributes 251
17.1 Attribute classes 251
17.1.1 The
AttributeUsage
attribute 251
17.1.2 Positional and named parameters 252
17.1.3 Attribute parameter types 253
17.2 Attribute specification 253
17.3 Attribute instances 255
17.3.1 Compilation of an attribute 255
17.3.2 Run-time retrieval of an attribute instance 255
17.4 Reserved attributes 256
17.4.1 The
AttributeUsage
attribute 256
17.4.2 The
Conditional
attribute 257
17.4.3 The
Obsolete
attribute 259
18. Versioning 261
19. Unsafe code 263
19.1 Unsafe code 263
19.2 Pointer types 263
20. Interoperability 265
Table of Contents
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
xi
20.1 Attributes 265
20.1.1 The
COMImport
attribute 265
20.1.2 The
COMSourceInterfaces
attribute 265
20.1.3 The
COMVisibility attribute 266
20.1.4 The
DispId
attribute 266
20.1.5 The
DllImport
attribute 266
20.1.6 The
GlobalObject
attribute 267
20.1.7 The
Guid
attribute 267
20.1.8 The
HasDefaultInterface attribute 267
20.1.9 The
ImportedFromCOM
attribute 267
20.1.10 The
In
and
Out
attributes 268
20.1.11 The
InterfaceType attribute 268
20.1.12 The
IsCOMRegisterFunction
attribute 268
20.1.13 The
Marshal attribute 269
20.1.14 The
Name
attribute 269
20.1.15 The
NoIDispatch
attribute 270
20.1.16 The
NonSerialized
attribute 270
20.1.17 The
Predeclared
attribute 270
20.1.18 The
ReturnsHResult
attribute 270
20.1.19 The
Serializable
attribute 271
20.1.20 The
StructLayout
attribute 271
20.1.21 The
StructOffset
attribute 271
20.1.22 The
TypeLibFunc
attribute 271
20.1.23 The
TypeLibType
attribute 272
20.1.24 The
TypeLibVar
attribute 272
20.2 Supporting enums 272
21. References 275
Chapter 1 Introduction
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
1
1. Introduction
C# is a simple, modern, object oriented, and type-safe programming language derived from C and C++. C#
(pronounced “C sharp”) is firmly planted in the C and C++ family tree of languages, and will immediately be
familiar to C and C++ programmers. C# aims to combine the high productivity of Visual Basic and the raw
power of C++.
C# is provided as a part of Microsoft Visual Studio 7.0. In addition to C#, Visual Studio supports Visual Basic,
Visual C++, and the scripting languages VBScript and JScript. All of these languages provide access to the Next
Generation Windows Services (NWGS) platform, which includes a common execution engine and a rich class
library. The .NET software development kit defines a "Common Language Subset" (CLS), a sort of lingua
franca that ensures seamless interoperability between CLS-compliant languages and class libraries. For C#
developers, this means that even though C# is a new language, it has complete access to the same rich class
libraries that are used by seasoned tools such as Visual Basic and Visual C++. C# itself does not include a class
library.
The rest of this chapter describes the essential features of the language. While later chapters describe rules and
exceptions in a detail-oriented and sometimes mathematical manner, this chapter strives for clarity and brevity at
the expense of completeness. The intent is to provide the reader with an introduction to the language that will
facilitate the writing of early programs and the reading of later chapters.
1.1 Hello, world
The canonical “Hello, world” program can be written in C# as follows:
using System;
class Hello
{
static void Main() {
Console.WriteLine("Hello, world");
}
}
The default file extension for C# programs is
.cs
, as in
hello.cs
. Such a program can be compiled with the
command line directive
csc hello.cs
which produces an executable program named
hello.exe
. The output of the program is:
Hello, world
Close examination of this program is illuminating:
• The
using System;
directive references a namespace called
System
that is provided by the .NET
runtime. This namespace contains the
Console
class referred to in the
Main
method. Namespaces
provide a hierarchical means of organizing the elements of a class library. A “using” directive enables
unqualified use of the members of a namespace. The “Hello, world” program uses
Console.WriteLine
as a shorthand for
System.Console.WriteLine
. What do these identifiers
denote?
System
is a namespace,
Console
is a class defined in that namespace, and
WriteLine
is a
static method defined on that class.
C# LANGUAGE REFERENCE
2
Copyright
Microsoft Corporation 1999-2000. All Rights Reserved.
• The
Main
function is a static member of the class
Hello
. Functions and variables are not supported at
the global level; such elements are always contained within type declarations (e.g., class and struct
declarations).
• The “Hello, world” output is produced through the use of a class library. C# does not itself provide a
class library. Instead, C# uses a common class library that is also used by other languages such as Visual
Basic and Visual C++.
For C and C++ developers, it is interesting to note a few things that do
not
appear in the “Hello, world”
program.
• The program does not use either “
::
” or “
->
” operators. The “
::
” is not an operator in C# at all, and
the “
->” operator is used in only a small fraction of C# programs. C# programs use “.” as a separator in
compound names such as
Console.WriteLine
.
• The program does not contain forward declarations. Forward declarations are never needed in C#
programs, as declaration order is not significant.
• The program does not use
#include
to import program text. Dependencies between programs are
handled symbolically rather than with program text. This system eliminates barriers between programs
written in different languages. For example, the
Console
class could be written in C# or in some other
language.
1.2 Automatic memory management
Manual memory management
requires developers to manage the allocation and de-allocation of blocks of
memory. Manual memory management is both time consuming and difficult. C# provides automatic memory
management so that developers are freed from this burdensome task. In the vast majority of cases, this automatic
memory management increases code quality and enhances developer productivity without negatively impacting
either expressiveness or performance.
The example
using System;
public class Stack
{
private Node first = null;
public bool Empty {
get {
return (first == null);
}
}
public object Pop() {
if (first == null)
throw new Exception("Can't Pop from an empty Stack.");
else {
object temp = first.Value;
first = first.Next;
return temp;
}
}
public void Push(object o) {
first = new Node(o, first);
}
Không có nhận xét nào:
Đăng nhận xét