Change Set Date Downloads Comment
1050
by tempuser2010
Jul 2 at
1:14 AM
0 Tf.exe Adding LengthyFolder
1049
by tempuser2010
Jul 2 at
1:14 AM
0 Tf.exe Adding Specials
1048
by tempuser2010
Jul 2 at
1:13 AM
0 Tf.exe Adding ConsoleApplication1
1047
by tempuser2010
Jul 2 at
1:13 AM
0 Tf.exe Deleted all the content
1046
by tempuser2010
Jul 2 at
1:13 AM
0 cpc.exe Adding LengthyFolder
1045
by tempuser2010
Jul 2 at
1:13 AM
0 cpc.exe Adding Specials
1044
by tempuser2010
Jul 2 at
1:12 AM
0 cpc.exe Adding ConsoleApplication1
1043
by tuxon2
Jul 2 at
12:37 AM
0





C#
Language Specification
Version 3.0

Notice
© 1999-2007 Microsoft Corporation. All rights reserved.
Microsoft, Windows, Visual Basic, Visual C#, and Visual C++ are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries/regions.
Other product and company names mentioned herein may be the trademarks of their respective owners.

Table of Contents
1. Introduction 1
1.1 Hello world 1
1.2 Program structure 2
1.3 Types and variables 4
1.4 Expressions 6
1.5 Statements 8
1.6 Classes and objects 12
1.6.1 Members 12
1.6.2 Accessibility 13
1.6.3 Type parameters 13
1.6.4 Base classes 14
1.6.5 Fields 14
1.6.6 Methods 15
1.6.6.1 Parameters 15
1.6.6.2 Method body and local variables 16
1.6.6.3 Static and instance methods 17
1.6.6.4 Virtual, override, and abstract methods 18
1.6.6.5 Method overloading 20
1.6.7 Other function members 21
1.6.7.1 Constructors 22
1.6.7.2 Properties 23
1.6.7.3 Indexers 23
1.6.7.4 Events 24
1.6.7.5 Operators 24
1.6.7.6 Destructors 25
1.7 Structs 25
1.8 Arrays 26
1.9 Interfaces 27
1.10 Enums 29
1.11 Delegates 30
1.12 Attributes 31
2. Lexical structure 33
2.1 Programs 33
2.2 Grammars 33
2.2.1 Grammar notation 33
2.2.2 Lexical grammar 34
2.2.3 Syntactic grammar 34
2.3 Lexical analysis 34
2.3.1 Line terminators 35
2.3.2 Comments 35
2.3.3 White space 37
2.4 Tokens 37
2.4.1 Unicode character escape sequences 37
2.4.2 Identifiers 38
2.4.3 Keywords 40
2.4.4 Literals 40
2.4.4.1 Boolean literals 40
2.4.4.2 Integer literals 40
2.4.4.3 Real literals 42
2.4.4.4 Character literals 42
2.4.4.5 String literals 43
2.4.4.6 The null literal 45
2.4.5 Operators and punctuators 45
2.5 Pre-processing directives 45
2.5.1 Conditional compilation symbols 47
2.5.2 Pre-processing expressions 47
2.5.3 Declaration directives 48
2.5.4 Conditional compilation directives 49
2.5.5 Diagnostic directives 51
2.5.6 Region directives 52
2.5.7 Line directives 52
2.5.8 Pragma directives 53
2.5.8.1 Pragma warning 53
3. Basic concepts 55
3.1 Application Startup 55
3.2 Application termination 56
3.3 Declarations 56
3.4 Members 58
3.4.1 Namespace members 59
3.4.2 Struct members 59
3.4.3 Enumeration members 59
3.4.4 Class members 59
3.4.5 Interface members 60
3.4.6 Array members 60
3.4.7 Delegate members 60
3.5 Member access 60
3.5.1 Declared accessibility 60
3.5.2 Accessibility domains 61
3.5.3 Protected access for instance members 63
3.5.4 Accessibility constraints 64
3.6 Signatures and overloading 65
3.7 Scopes 66
3.7.1 Name hiding 69
3.7.1.1 Hiding through nesting 69
3.7.1.2 Hiding through inheritance 70
3.8 Namespace and type names 71
3.8.1 Fully qualified names 73
3.9 Automatic memory management 74
3.10 Execution order 76
4. Types 79
4.1 Value types 79
4.1.1 The System.ValueType type 80
4.1.2 Default constructors 80
4.1.3 Struct types 81
4.1.4 Simple types 81
4.1.5 Integral types 82
4.1.6 Floating point types 83
4.1.7 The decimal type 84
4.1.8 The bool type 85
4.1.9 Enumeration types 85
4.1.10 Nullable types 85
4.2 Reference types 86
4.2.1 Class types 86
4.2.2 The object type 87
4.2.3 The string type 87
4.2.4 Interface types 87
4.2.5 Array types 87
4.2.6 Delegate types 87
4.3 Boxing and unboxing 88
4.3.1 Boxing conversions 88
4.3.2 Unboxing conversions 89
4.4 Constructed types 90
4.4.1 Type arguments 91
4.4.2 Open and closed types 91
4.4.3 Bound and unbound types 91
4.4.4 Satisfying constraints 91
4.5 Type parameters 92
4.6 Expression tree types 93
5. Variables 95
5.1 Variable categories 95
5.1.1 Static variables 95
5.1.2 Instance variables 95
5.1.2.1 Instance variables in classes 96
5.1.2.2 Instance variables in structs 96
5.1.3 Array elements 96
5.1.4 Value parameters 96
5.1.5 Reference parameters 96
5.1.6 Output parameters 97
5.1.7 Local variables 97
5.2 Default values 98
5.3 Definite assignment 98
5.3.1 Initially assigned variables 99
5.3.2 Initially unassigned variables 99
5.3.3 Precise rules for determining definite assignment 99
5.3.3.1 General rules for statements 100
5.3.3.2 Block statements, checked, and unchecked statements 100
5.3.3.3 Expression statements 100
5.3.3.4 Declaration statements 101
5.3.3.5 If statements 101
5.3.3.6 Switch statements 101
5.3.3.7 While statements 101
5.3.3.8 Do statements 102
5.3.3.9 For statements 102
5.3.3.10 Break, continue, and goto statements 102
5.3.3.11 Throw statements 102
5.3.3.12 Return statements 102
5.3.3.13 Try-catch statements 103
5.3.3.14 Try-finally statements 103
5.3.3.15 Try-catch-finally statements 103
5.3.3.16 Foreach statements 104
5.3.3.17 Using statements 104
5.3.3.18 Lock statements 105
5.3.3.19 Yield statements 105
5.3.3.20 General rules for simple expressions 105
5.3.3.21 General rules for expressions with embedded expressions 105
5.3.3.22 Invocation expressions and object creation expressions 106
5.3.3.23 Simple assignment expressions 106
5.3.3.24 && expressions 106
5.3.3.25 || expressions 107
5.3.3.26 ! expressions 108
5.3.3.27 ?? expressions 108
5.3.3.28 ?: expressions 109
5.3.3.29 Anonymous functions 109
5.4 Variable references 110
5.5 Atomicity of variable references 110
6. Conversions 111
6.1 Implicit conversions 111
6.1.1 Identity conversion 111
6.1.2 Implicit numeric conversions 111
6.1.3 Implicit enumeration conversions 112
6.1.4 Implicit nullable conversions 112
6.1.5 Null literal conversions 112
6.1.6 Implicit reference conversions 113
6.1.7 Boxing conversions 113
6.1.8 Implicit constant expression conversions 114
6.1.9 Implicit conversions involving type parameters 114
6.1.10 User-defined implicit conversions 114
6.1.11 Anonymous function conversions and method group conversions 114
6.2 Explicit conversions 114
6.2.1 Explicit numeric conversions 115
6.2.2 Explicit enumeration conversions 116
6.2.3 Explicit nullable conversions 117
6.2.4 Explicit reference conversions 117
6.2.5 Unboxing conversions 118
6.2.6 Explicit conversions involving type parameters 118
6.2.7 User-defined explicit conversions 119
6.3 Standard conversions 119
6.3.1 Standard implicit conversions 119
6.3.2 Standard explicit conversions 120
6.4 User-defined conversions 120
6.4.1 Permitted user-defined conversions 120
6.4.2 Lifted conversion operators 120
6.4.3 Evaluation of user-defined conversions 120
6.4.4 User-defined implicit conversions 121
6.4.5 User-defined explicit conversions 122
6.5 Anonymous function conversions 123
6.5.1 Evaluation of anonymous function conversions to delegate types 124
6.5.2 Evaluation of anonymous function conversions to expression tree types 125
6.5.3 Implementation example 125
6.6 Method group conversions 127
7. Expressions 131
7.1 Expression classifications 131
7.1.1 Values of expressions 132
7.2 Operators 132
7.2.1 Operator precedence and associativity 132
7.2.2 Operator overloading 133
7.2.3 Unary operator overload resolution 135
7.2.4 Binary operator overload resolution 135
7.2.5 Candidate user-defined operators 135
7.2.6 Numeric promotions 136
7.2.6.1 Unary numeric promotions 136
7.2.6.2 Binary numeric promotions 136
7.2.7 Lifted operators 137
7.3 Member lookup 138
7.3.1 Base types 139
7.4 Function members 139
7.4.1 Argument lists 142
7.4.2 Type inference 144
7.4.2.1 The first phase 145
7.4.2.2 The second phase 145
7.4.2.3 Input types 145
7.4.2.4 Output types 145
7.4.2.5 Dependence 145
7.4.2.6 Output type inferences 145
7.4.2.7 Explicit parameter type inferences 146
7.4.2.8 Exact inferences 146
7.4.2.9 Lower-bound inferences 146
7.4.2.10 Fixing 146
7.4.2.11 Inferred return type 147
7.4.2.12 Type inference for conversion of method groups 148
7.4.2.13 Finding the best common type of a set of expressions 148
7.4.3 Overload resolution 148
7.4.3.1 Applicable function member 149
7.4.3.2 Better function member 149
7.4.3.3 Better conversion from expression 150
7.4.3.4 Better conversion from type 151
7.4.3.5 Overloading in generic classes 151
7.4.4 Function member invocation 152
7.4.4.1 Invocations on boxed instances 153
7.5 Primary expressions 153
7.5.1 Literals 154
7.5.2 Simple names 154
7.5.2.1 Invariant meaning in blocks 156
7.5.3 Parenthesized expressions 156
7.5.4 Member access 157
7.5.4.1 Identical simple names and type names 158
7.5.4.2 Grammar ambiguities 159
7.5.5 Invocation expressions 160
7.5.5.1 Method invocations 160
7.5.5.2 Extension method invocations 161
7.5.5.3 Delegate invocations 163
7.5.6 Element access 164
7.5.6.1 Array access 164
7.5.6.2 Indexer access 165
7.5.7 This access 165
7.5.8 Base access 166
7.5.9 Postfix increment and decrement operators 166
7.5.10 The new operator 167
7.5.10.1 Object creation expressions 168
7.5.10.2 Object initializers 169
7.5.10.3 Collection initializers 171
7.5.10.4 Array creation expressions 172
7.5.10.5 Delegate creation expressions 174
7.5.10.6 Anonymous object creation expressions 175
7.5.11 The typeof operator 177
7.5.12 The checked and unchecked operators 178
7.5.13 Default value expressions 180
7.5.14 Anonymous method expressions 181
7.6 Unary operators 181
7.6.1 Unary plus operator 181
7.6.2 Unary minus operator 181
7.6.3 Logical negation operator 182
7.6.4 Bitwise complement operator 182
7.6.5 Prefix increment and decrement operators 183
7.6.6 Cast expressions 183
7.7 Arithmetic operators 184
7.7.1 Multiplication operator 184
7.7.2 Division operator 185
7.7.3 Remainder operator 186
7.7.4 Addition operator 187
7.7.5 Subtraction operator 189
7.8 Shift operators 191
7.9 Relational and type-testing operators 192
7.9.1 Integer comparison operators 192
7.9.2 Floating-point comparison operators 193
7.9.3 Decimal comparison operators 194
7.9.4 Boolean equality operators 194
7.9.5 Enumeration comparison operators 194
7.9.6 Reference type equality operators 194
7.9.7 String equality operators 196
7.9.8 Delegate equality operators 196
7.9.9 Equality operators and null 197
7.9.10 The is operator 197
7.9.11 The as operator 198
7.10 Logical operators 198
7.10.1 Integer logical operators 199
7.10.2 Enumeration logical operators 199
7.10.3 Boolean logical operators 199
7.10.4 Nullable boolean logical operators 199
7.11 Conditional logical operators 200
7.11.1 Boolean conditional logical operators 201
7.11.2 User-defined conditional logical operators 201
7.12 The null coalescing operator 201
7.13 Conditional operator 202
7.14 Anonymous function expressions 203
7.14.1 Anonymous function signatures 205
7.14.2 Anonymous function bodies 205
7.14.3 Overload resolution 206
7.14.4 Outer variables 206
7.14.4.1 Captured outer variables 206
7.14.4.2 Instantiation of local variables 207
7.14.5 Evaluation of anonymous function expressions 209
7.15 Query expressions 209
7.15.1 Ambiguities in query expressions 211
7.15.2 Query expression translation 211
7.15.2.1 Select and groupby clauses with continuations 211
7.15.2.2 Explicit range variable types 212
7.15.2.3 Degenerate query expressions 212
7.15.2.4 From, let, where, join and orderby clauses 213
7.15.2.5 Select clauses 216
7.15.2.6 Groupby clauses 216
7.15.2.7 Transparent identifiers 217
7.15.3 The query expression pattern 218
7.16 Assignment operators 219
7.16.1 Simple assignment 220
7.16.2 Compound assignment 222
7.16.3 Event assignment 223
7.17 Expression 223
7.18 Constant expressions 223
7.19 Boolean expressions 225
8. Statements 227
8.1 End points and reachability 227
8.2 Blocks 229
8.2.1 Statement lists 229
8.3 The empty statement 230
8.4 Labeled statements 230
8.5 Declaration statements 231
8.5.1 Local variable declarations 231
8.5.2 Local constant declarations 232
8.6 Expression statements 233
8.7 Selection statements 233
8.7.1 The if statement 233
8.7.2 The switch statement 234
8.8 Iteration statements 237
8.8.1 The while statement 238
8.8.2 The do statement 238
8.8.3 The for statement 239
8.8.4 The foreach statement 240
8.9 Jump statements 242
8.9.1 The break statement 243
8.9.2 The continue statement 244
8.9.3 The goto statement 244
8.9.4 The return statement 245
8.9.5 The throw statement 246
8.10 The try statement 247
8.11 The checked and unchecked statements 250
8.12 The lock statement 250
8.13 The using statement 251
8.14 The yield statement 253
9. Namespaces 255
9.1 Compilation units 255
9.2 Namespace declarations 255
9.3 Extern aliases 257
9.4 Using directives 257
9.4.1 Using alias directives 258
9.4.2 Using namespace directives 260
9.5 Namespace members 262
9.6 Type declarations 262
9.7 Namespace alias qualifiers 263
9.7.1 Uniqueness of aliases 264
10. Classes 265
10.1 Class declarations 265
10.1.1 Class modifiers 265
10.1.1.1 Abstract classes 266
10.1.1.2 Sealed classes 266
10.1.1.3 Static classes 266
10.1.2 Partial modifier 267
10.1.3 Type parameters 267
10.1.4 Class base specification 268
10.1.4.1 Base classes 268
10.1.4.2 Interface implementations 269
10.1.5 Type parameter constraints 270
10.1.6 Class body 274
10.2 Partial types 274
10.2.1 Attributes 274
10.2.2 Modifiers 274
10.2.3 Type parameters and constraints 275
10.2.4 Base class 275
10.2.5 Base interfaces 275
10.2.6 Members 276
10.2.7 Partial methods 276
10.2.8 Name binding 279
10.3 Class members 279
10.3.1 The instance type 281
10.3.2 Members of constructed types 281
10.3.3 Inheritance 282
10.3.4 The new modifier 283
10.3.5 Access modifiers 283
10.3.6 Constituent types 283
10.3.7 Static and instance members 283
10.3.8 Nested types 284
10.3.8.1 Fully qualified name 285
10.3.8.2 Declared accessibility 285
10.3.8.3 Hiding 285
10.3.8.4 this access 286
10.3.8.5 Access to private and protected members of the containing type 287
10.3.8.6 Nested types in generic classes 288
10.3.9 Reserved member names 288
10.3.9.1 Member names reserved for properties 289
10.3.9.2 Member names reserved for events 289
10.3.9.3 Member names reserved for indexers 289
10.3.9.4 Member names reserved for destructors 290
10.4 Constants 290
10.5 Fields 291
10.5.1 Static and instance fields 293
10.5.2 Readonly fields 293
10.5.2.1 Using static readonly fields for constants 294
10.5.2.2 Versioning of constants and static readonly fields 294
10.5.3 Volatile fields 295
10.5.4 Field initialization 296
10.5.5 Variable initializers 296
10.5.5.1 Static field initialization 297
10.5.5.2 Instance field initialization 298
10.6 Methods 299
10.6.1 Method parameters 300
10.6.1.1 Value parameters 301
10.6.1.2 Reference parameters 302
10.6.1.3 Output parameters 303
10.6.1.4 Parameter arrays 303
10.6.2 Static and instance methods 306
10.6.3 Virtual methods 306
10.6.4 Override methods 308
10.6.5 Sealed methods 310
10.6.6 Abstract methods 311
10.6.7 External methods 312
10.6.8 Partial methods 313
10.6.9 Extension methods 313
10.6.10 Method body 313
10.6.11 Method overloading 314
10.7 Properties 314
10.7.1 Static and instance properties 315
10.7.2 Accessors 316
10.7.3 Automatically implemented properties 320
10.7.4 Accessibility 321
10.7.5 Virtual, sealed, override, and abstract accessors 322
10.8 Events 324
10.8.1 Field-like events 326
10.8.2 Event accessors 327
10.8.3 Static and instance events 328
10.8.4 Virtual, sealed, override, and abstract accessors 329
10.9 Indexers 329
10.9.1 Indexer overloading 333
10.10 Operators 333
10.10.1 Unary operators 335
10.10.2 Binary operators 335
10.10.3 Conversion operators 336
10.11 Instance constructors 338
10.11.1 Constructor initializers 339
10.11.2 Instance variable initializers 340
10.11.3 Constructor execution 340
10.11.4 Default constructors 342
10.11.5 Private constructors 342
10.11.6 Optional instance constructor parameters 343
10.12 Static constructors 343
10.13 Destructors 345
10.14 Iterators 347
10.14.1 Enumerator interfaces 347
10.14.2 Enumerable interfaces 347
10.14.3 Yield type 347
10.14.4 Enumerator objects 347
10.14.4.1 The MoveNext method 348
10.14.4.2 The Current property 349
10.14.4.3 The Dispose method 349
10.14.5 Enumerable objects 349
10.14.5.1 The GetEnumerator method 350
10.14.6 Implementation example 350
11. Structs 357
11.1 Struct declarations 357
11.1.1 Struct modifiers 357
11.1.2 Partial modifier 358
11.1.3 Struct interfaces 358
11.1.4 Struct body 358
11.2 Struct members 358
11.3 Class and struct differences 358
11.3.1 Value semantics 359
11.3.2 Inheritance 360
11.3.3 Assignment 360
11.3.4 Default values 360
11.3.5 Boxing and unboxing 361
11.3.6 Meaning of this 362
11.3.7 Field initializers 363
11.3.8 Constructors 363
11.3.9 Destructors 364
11.3.10 Static constructors 364
11.4 Struct examples 364
11.4.1 Database integer type 364
11.4.2 Database boolean type 366
12. Arrays 369
12.1 Array types 369
12.1.1 The System.Array type 370
12.1.2 Arrays and the generic IList interface 370
12.2 Array creation 370
12.3 Array element access 371
12.4 Array members 371
12.5 Array covariance 371
12.6 Array initializers 371
13. Interfaces 375
13.1 Interface declarations 375
13.1.1 Interface modifiers 375
13.1.2 Partial modifier 375
13.1.3 Base interfaces 376
13.1.4 Interface body 376
13.2 Interface members 376
13.2.1 Interface methods 378
13.2.2 Interface properties 378
13.2.3 Interface events 378
13.2.4 Interface indexers 378
13.2.5 Interface member access 379
13.3 Fully qualified interface member names 380
13.4 Interface implementations 381
13.4.1 Explicit interface member implementations 382
13.4.2 Uniqueness of implemented interfaces 384
13.4.3 Implementation of generic methods 385
13.4.4 Interface mapping 385
13.4.5 Interface implementation inheritance 388
13.4.6 Interface re-implementation 389
13.4.7 Abstract classes and interfaces 391
14. Enums 393
14.1 Enum declarations 393
14.2 Enum modifiers 393
14.3 Enum members 394
14.4 The System.Enum type 396
14.5 Enum values and operations 396
15. Delegates 397
15.1 Delegate declarations 397
15.2 Delegate compatibility 399
15.3 Delegate instantiation 399
15.4 Delegate invocation 400
16. Exceptions 403
16.1 Causes of exceptions 403
16.2 The System.Exception class 403
16.3 How exceptions are handled 403
16.4 Common Exception Classes 404
17. Attributes 407
17.1 Attribute classes 407
17.1.1 Attribute usage 407
17.1.2 Positional and named parameters 408
17.1.3 Attribute parameter types 409
17.2 Attribute specification 409
17.3 Attribute instances 414
17.3.1 Compilation of an attribute 415
17.3.2 Run-time retrieval of an attribute instance 415
17.4 Reserved attributes 415
17.4.1 The AttributeUsage attribute 415
17.4.2 The Conditional attribute 416
17.4.2.1 Conditional methods 416
17.4.2.2 Conditional attribute classes 418
17.4.3 The Obsolete attribute 419
17.5 Attributes for Interoperation 420
17.5.1 Interoperation with COM and Win32 components 421
17.5.2 Interoperation with other .NET languages 421
17.5.2.1 The IndexerName attribute 421
18. Unsafe code 423
18.1 Unsafe contexts 423
18.2 Pointer types 425
18.3 Fixed and moveable variables 428
18.4 Pointer conversions 428
18.5 Pointers in expressions 429
18.5.1 Pointer indirection 430
18.5.2 Pointer member access 430
18.5.3 Pointer element access 431
18.5.4 The address-of operator 432
18.5.5 Pointer increment and decrement 433
18.5.6 Pointer arithmetic 433
18.5.7 Pointer comparison 434
18.5.8 The sizeof operator 434
18.6 The fixed statement 435
18.7 Fixed size buffers 438
18.7.1 Fixed size buffer declarations 438
18.7.2 Fixed size buffers in expressions 440
18.7.3 Definite assignment checking 440
18.8 Stack allocation 441
18.9 Dynamic memory allocation 442
A. Documentation comments 445
A.1 Introduction 445
A.2 Recommended tags 446
A.2.1 <c> 447
A.2.2 <code> 447
A.2.3 <example> 448
A.2.4 <exception> 448
A.2.5 <include> 449
A.2.6 <list> 449
A.2.7 <para> 450
A.2.8 <param> 451
A.2.9 <paramref> 451
A.2.10 <permission> 451
A.2.11 <summary> 452
A.2.12 <returns> 452
A.2.13 <see> 453
A.2.14 <seealso> 453
A.2.15 <summary> 454
A.2.16 <value> 454
A.2.17 <typeparam> 454
A.2.18 <typeparamref> 455
A.3 Processing the documentation file 455
A.3.1 ID string format 455
A.3.2 ID string examples 456
A.4 An example 460
A.4.1 C# source code 460
A.4.2 Resulting XML 462
B. Grammar 468
B.1 Lexical grammar 468
B.1.1 Line terminators 468
B.1.2 Comments 468
B.1.3 White space 469
B.1.4 Tokens 469
B.1.5 Unicode character escape sequences 469
B.1.6 Identifiers 470
B.1.7 Keywords 471
B.1.8 Literals 471
B.1.9 Operators and punctuators 473
B.1.10 Pre-processing directives 473
B.2 Syntactic grammar 476
B.2.1 Basic concepts 476
B.2.2 Types 476
B.2.3 Variables 477
B.2.4 Expressions 478
B.2.5 Statements 484
B.2.6 Namespaces 488
B.2.7 Classes 489
B.2.8 Structs 496
B.2.9 Arrays 496
B.2.10 Interfaces 497
B.2.11 Enums 498
B.2.12 Delegates 498
B.2.13 Attributes 499
B.3 Grammar extensions for unsafe code 500
C. References 505

1. Introduction
C# (pronounced “See Sharp”) is a simple, modern, object-oriented, and type-safe programming language. C# has its roots in the C family of languages and will be immediately familiar to C, C++, and Java programmers. C# is standardized by ECMA International as the ECMA-334 standard and by ISO/IEC as the ISO/IEC 23270 standard. Microsoft’s C# compiler for the .NET Framework is a conforming implementation of both of these standards.
C# is an object-oriented language, but C# further includes support for component-oriented programming. Contemporary software design increasingly relies on software components in the form of self-contained and self-describing packages of functionality. Key to such components is that they present a programming model with properties, methods, and events; they have attributes that provide declarative information about the component; and they incorporate their own documentation. C# provides language constructs to directly support these concepts, making C# a very natural language in which to create and use software components.
Several C# features aid in the construction of robust and durable applications: Garbage collection automatically reclaims memory occupied by unused objects; exception handling provides a structured and extensible approach to error detection and recovery; and the type-safe design of the language makes it impossible to read from uninitialized variables, to index arrays beyond their bounds, or to perform unchecked type casts.
C# has a unified type system. All C# types, including primitive types such as int and double, inherit from a single root object type. Thus, all types share a set of common operations, and values of any type can be stored, transported, and operated upon in a consistent manner. Furthermore, C# supports both user-defined reference types and value types, allowing dynamic allocation of objects as well as in-line storage of lightweight structures.
To ensure that C# programs and libraries can evolve over time in a compatible manner, much emphasis has been placed on versioning in C#’s design. Many programming languages pay little attention to this issue, and, as a result, programs written in those languages break more often than necessary when newer versions of dependent libraries are introduced. Aspects of C#’s design that were directly influenced by versioning considerations include the separate virtual and override modifiers, the rules for method overload resolution, and support for explicit interface member declarations.
The rest of this chapter describes the essential features of the C# language. Although 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 “Hello, World” program is traditionally used to introduce a programming language. Here it is in C#:
using System;
class Hello
{
static void Main() {
Console.WriteLine("Hello, World");
}
}
C# source files typically have the file extension .cs. Assuming that the “Hello, World” program is stored in the file hello.cs, the program can be compiled with the Microsoft C# compiler using the command line
csc hello.cs
which produces an executable assembly named hello.exe. The output produced by this application when it is run is
Hello, World
The “Hello, World” program starts with a using directive that references the System namespace. Namespaces provide a hierarchical means of organizing C# programs and libraries. Namespaces contain types and other namespaces—for example, the System namespace contains a number of types, such as the Console class referenced in the program, and a number of other namespaces, such as IO and Collections. A using directive that references a given namespace enables unqualified use of the types that are members of that namespace. Because of the using directive, the program can use Console.WriteLine as shorthand for System.Console.WriteLine.
The Hello class declared by the “Hello, World” program has a single member, the method named Main. The Main method is declared with the static modifier. While instance methods can reference a particular enclosing object instance using the keyword this, static methods operate without reference to a particular object. By convention, a static method named Main serves as the entry point of a program.
The output of the program is produced by the WriteLine method of the Console class in the System namespace. This class is provided by the .NET Framework class libraries, which, by default, are automatically referenced by the Microsoft C# compiler. Note that C# itself does not have a separate runtime library. Instead, the .NET Framework is the runtime library of C#.
1.2 Program structure
The key organizational concepts in C# are programs, namespaces, types, members, and assemblies. C# programs consist of one or more source files. Programs declare types, which contain members and can be organized into namespaces. Classes and interfaces are examples of types. Fields, methods, properties, and events are examples of members. When C# programs are compiled, they are physically packaged into assemblies. Assemblies typically have the file extension .exe or .dll, depending on whether they implement applications or libraries.
The example
using System;
namespace Acme.Collections
{
public class Stack
{
Entry top;
public void Push(object data) {
top = new Entry(top, data);
}
public object Pop() {
if (top == null) throw new InvalidOperationException();
object result = top.data;
top = top.next;
return result;
}
class Entry
{
public Entry next;
public object data;
public Entry(Entry next, object data) {
this.next = next;
this.data = data;
}
}
}
}
declares a class named Stack in a namespace called Acme.Collections. The fully qualified name of this class is Acme.Collections.Stack. The class contains several members: a field named top, two methods named Push and Pop, and a nested class named Entry. The Entry class further contains three members: a field named next, a field named data, and a constructor. Assuming that the source code of the example is stored in the file acme.cs, the command line
csc /t:library acme.cs
compiles the example as a library (code without a Main entry point) and produces an assembly named acme.dll.
Assemblies contain executable code in the form of Intermediate Language (IL) instructions, and symbolic information in the form of metadata. Before it is executed, the IL code in an assembly is automatically converted to processor-specific code by the Just-In-Time (JIT) compiler of .NET Common Language Runtime.
Because an assembly is a self-describing unit of functionality containing both code and metadata, there is no need for #include directives and header files in C#. The public types and members contained in a particular assembly are made available in a C# program simply by referencing that assembly when compiling the program. For example, this program uses the Acme.Collections.Stack class from the acme.dll assembly:
using System;
using Acme.Collections;
class Test
{
static void Main() {
Stack s = new Stack();
s.Push(1);
s.Push(10);
s.Push(100);
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
}
}
If the program is stored in the file test.cs, when test.cs is compiled, the acme.dll assembly can be referenced using the compiler’s /r option:
csc /r:acme.dll test.cs
This creates an executable assembly named test.exe, which, when run, produces the output:
100
10
1
C# permits the source text of a program to be stored in several source files. When a multi-file C# program is compiled, all of the source files are processed together, and the source files can freely reference each other—conceptually, it is as if all the source files were concatenated into one large file before being processed. Forward declarations are never needed in C# because, with very few exceptions, declaration order is insignificant. C# does not limit a source file to declaring only one public type nor does it require the name of the source file to match a type declared in the source file.
1.3 Types and variables
There are two kinds of types in C#: value types and reference types. Variables of value types directly contain their data whereas variables of reference types store references to their data, the latter being known as objects. With reference types, it is possible for two variables to reference the same object and thus possible for operations on one variable to affect the object referenced by the other variable. With value types, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other (except in the case of ref and out parameter variables).
C#’s value types are further divided into simple types, enum types, struct types, and nullable types, and C#’s reference types are further divided into class types, interface types, array types, and delegate types.
The following table provides an overview of C#’s type system.

Category Description
Value
types Simple types Signed integral: sbyte, short, int, long
Unsigned integral: byte, ushort, uint, ulong
Unicode characters: char
IEEE floating point: float, double
High-precision decimal: decimal
Boolean: bool
Enum types User-defined types of the form enum E {...}
Struct types User-defined types of the form struct S {...}
Nullable types Extensions of all other value types with a null value
Reference
types Class types Ultimate base class of all other types: object
Unicode strings: string
User-defined types of the form class C {...}
Interface types User-defined types of the form interface I {...}
Array types Single- and multi-dimensional, for example, int[] and int[,]
Delegate types User-defined types of the form e.g. delegate int D(...)

The eight integral types provide support for 8-bit, 16-bit, 32-bit, and 64-bit values in signed or unsigned form.
The two floating point types, float and double, are represented using the 32-bit single-precision and 64-bit double-precision IEEE 754 formats.
The decimal type is a 128-bit data type suitable for financial and monetary calculations.
C#’s bool type is used to represent boolean values—values that are either true or false.
Character and string processing in C# uses Unicode encoding. The char type represents a UTF-16 code unit, and the string type represents a sequence of UTF-16 code units.
The following table summarizes C#’s numeric types.

Category Bits Type Range/Precision
Signed integral 8 sbyte –128...127
16 short –32,768...32,767
32 int –2,147,483,648...2,147,483,647
64 long –9,223,372,036,854,775,808...9,223,372,036,854,775,807
Unsigned integral 8 byte 0...255
16 ushort 0...65,535
32 uint 0...4,294,967,295
64 ulong 0...18,446,744,073,709,551,615
Floating point 32 float 1.5 × 10−45 to 3.4 × 1038, 7-digit precision
64 double 5.0 × 10−324 to 1.7 × 10308, 15-digit precision
Decimal 128 decimal 1.0 × 10−28 to 7.9 × 1028, 28-digit precision

C# programs use type declarations to create new types. A type declaration specifies the name and the members of the new type. Five of C#’s categories of types are user-definable: class types, struct types, interface types, enum types, and delegate types.
A class type defines a data structure that contains data members (fields) and function members (methods, properties, and others). Class ty


1-8 of 8Change Sets < Previous 1 Next >
Updating...
© 2006-2009 Microsoft | About CodePlex | Privacy Statement | Terms of Use | Code of Conduct | Advertise With Us | Version 2009.10.27.15987