Essential.csharp.4.0

975
8/3/2019 Essential.csharp.4.0 http://slidepdf.com/reader/full/essentialcsharp40 1/975 Upper Saddle River, NJ Boston Indianapolis San Francisco New York Toronto Montreal London Munich Paris Madrid Capetown Sydney Tokyo Singapore Mexico City Essential C# 4.0 Mark Michaelis

Transcript of Essential.csharp.4.0

  • 8/3/2019 Essential.csharp.4.0

    1/975

    Upper Saddle River, NJ Boston Indianapolis San Francisco

    New York Toronto Montreal London Munich Paris Madrid

    Capetown Sydney Tokyo Singapore Mexico City

    EssentialC# 4.0

    Mark Michaelis

  • 8/3/2019 Essential.csharp.4.0

    2/975

    Many of the designations used by manufacturers and sellers to distinguish their products are claimed

    as trademarks. Where those designations appear in this book, and the publisher was aware of a trade-mark claim, the designations have been printed with initial capital letters or in all capitals.

    The .NET logo is either a registered trademark or trademark of Microsoft Corporation in the UnitedStates and/or other countries and is used under license from Microsoft.

    Microsoft, Windows, Visual Basic, Visual C#, and Visual C++ are either registered trademarks or trade-marks of Microsoft Corporation in the U.S.A. and/or other countries/regions.

    The author and publisher have taken care in the preparation of this book, but make no expressed orimplied warranty of any kind and assume no responsibility for errors or omissions. No liability isassumed for incidental or consequential damages in connection with or arising out of the use of theinformation or programs contained herein.

    The publisher offers excellent discounts on this book when ordered in quantity for bulk purchases orspecial sales, which may include electronic versions and/or custom covers and content particular toyour business, training goals, marketing focus, and branding interests. For more information, pleasecontact:

    U.S. Corporate and Government Sales(800) [email protected]

    For sales outside the United States, please contact:

    International Sales

    [email protected]

    Visit us on the Web: informit.com/aw

    Library of Congress Cataloging-in-Publication Data

    Michaelis, Mark.Essential C# 4.0 / Mark Michaelis.

    p. cm.Includes index.ISBN 978-0-321-69469-0 (pbk. : alk. paper)

    1. C# (Computer program language) I. Title.QA76.73.C154M5237 2010005.133dc22

    2009052592

    Copyright 2010 Pearson Education, Inc.

    All rights reserved. Printed in the United States of America. This publication is protected by copyright,and permission must be obtained from the publisher prior to any prohibited reproduction, storage in aretrieval system, or transmission in any form or by any means, electronic, mechanical, photocopying,recording, or likewise. For information regarding permissions, write to:

    Pearson Education, Inc.Rights and Contracts Department

    501 Boylston Street, Suite 900Boston, MA 02116Fax: (617) 671-3447

    ISBN-13: 978-0-321-69469-0ISBN-10: 0-321-69469-4Text printed in the United States on recycled paper at Edwards Brothers in Ann Arbor, Michigan.First printing, March 2010

  • 8/3/2019 Essential.csharp.4.0

    3/975

    To my family: Elisabeth, Benjamin, Hanna, and Abigail.

    You have sacrificed a husband and daddy for countless hours of writing,

    frequently at times when he was needed most.

    Thanks!

  • 8/3/2019 Essential.csharp.4.0

    4/975

    This page intentionally left blank

  • 8/3/2019 Essential.csharp.4.0

    5/975

    ix

    Contents at a Glance

    Contents xi

    Contents of C# 4.0 Topics xxv

    Figures xxvii

    Tables xxix

    Foreword xxxi

    Preface xxxvAcknowledgments xlvii

    About the Author li

    1 Introducing C# 1

    2 Data Types 31

    3 Operators and Control Flow 83

    4 Methods and Parameters 1495 Classes 201

    6 Inheritance 269

    7 Interfaces 305

    8 Value Types 331

    9 Well-Formed Types 357

    10 Exception Handling 405

    11 Generics 421

    12 Delegates and Lambda Expressions 469

  • 8/3/2019 Essential.csharp.4.0

    6/975

    Contents of C# 4.0 Topics

    13 Events 507

    14 Collection Interfaces with Standard Query Operators 535

    15 LINQ with Query Expressions 58916 Building Custom Collections 611

    17 Reflection, Attributes, and Dynamic Programming 651

    18 Multithreading 701

    19 Synchronization and More Multithreading Patterns 749

    20 Platform Interoperability and Unsafe Code 815

    21 The Common Language Infrastructure 843

    A Downloading and Installing the C# Compiler and theCLI Platform 865

    B Full Source Code Listings 869

    C Concurrent Classes from System. Collections. Concurrent 895

    D C# 2.0 Topics 899

    E C# 3.0 Topics 903

    F C# 4.0 Topics 905

    Index 907

  • 8/3/2019 Essential.csharp.4.0

    7/975

    xi

    Contents of C# 4.0 Topics xxvFigures xxviiTables xxixForeword xxxiPreface xxxv

    Acknowledgments xlvii

    About the Author li

    1 Introducing C# 1Hello, World 2

    Compiling and Running the Application 3

    C# Syntax Fundamentals 4Type Definition 7Main 8

    Statements and Statement Delimiters 10Whitespace 11

    Working with Variables 12Data Types 13Declaring a Variable 14Assigning a Variable 14Using a Variable 16

    Console Input and Output 16Getting Input from the Console 16

    Writing Output to the Console 18Comments 20Managed Execution and the Common Language Infrastructure 23

    Contents

  • 8/3/2019 Essential.csharp.4.0

    8/975

    Contents

    C# and .NET Versioning 26Common Intermediate Language and ILDASM 27Summary 30

    2 Data Types 31

    Fundamental Numeric Types 32Integer Types 32Floating-Point Types (float, double) 33Decimal Type 34Literal Values 35

    More Fundamental Types 40

    Boolean Type (bool) 40Character Type (char) 41Strings 43

    null and void 51null 51

    The voidNontype 52

    Categories of Types 55Value Types 55

    Reference Types 56

    Nullable Modifier 57Conversions between Data Types 58

    Explicit Cast 58Implicit Conversion 62Type Conversion without Casting 62

    Arrays 64Declaring an Array 65

    Instantiating and Assigning Arrays 66

    Using an Array 70Strings as Arrays 76Common Errors 78

    Summary 81

    3 Operators and Control Flow 83

    Operators 84Plus and Minus Unary Operators (+, -) 84Arithmetic Binary Operators (+, -, *, /, %) 85

    Parenthesis Operator 92Assignment Operators (+=, -=, *=, /=, %=) 93Increment and Decrement Operators (++, --) 94Constant Expressions (const) 98

  • 8/3/2019 Essential.csharp.4.0

    9/975

    Contents xiii

    Introducing Flow Control 98ifStatement 102Nested if 103

    Code Blocks ({}) 105Scope and Declaration Space 107Boolean Expressions 109

    Relational and Equality Operators 110Logical Boolean Operators 111Logical Negation Operator (!) 113Conditional Operator (?) 113Null Coalescing Operator (??) 114

    Bitwise Operators (, |, &, ^, ~) 115Shift Operators (, =) 116Bitwise Operators (&, |, ^) 117Bitwise Assignment Operators (&=, |=, ^=) 120Bitwise Complement Operator (~) 120

    Control Flow Statements, Continued 121The while and do/while Loops 121Thefor Loop 124Theforeach Loop 127

    The switch Statement 130Jump Statements 132The break Statement 132The continue Statement 135The goto Statement 137

    C# Preprocessor Directives 138Excluding and Including Code (#if, #elif, #else, #endif) 140Defining Preprocessor Symbols (#define, #undef) 141Emitting Errors and Warnings (#error, #warning) 141

    Turning Off Warning Messages (#pragma) 142nowarn: Option 143Specifying Line Numbers (#line) 143Hints for Visual Editors (#region, #endregion) 144

    Summary 145

    4 Methods and Parameters 149

    Calling a Method 150

    Namespace 152Type Name 154Scope 155Method Name 155Parameters 155

  • 8/3/2019 Essential.csharp.4.0

    10/975

    Contents

    Method Return 155Statement versus Method Call 156

    Declaring a Method 157

    Parameter Declaration 159Method Return Declaration 159

    The using Directive 161Aliasing 164

    Returns and Parameters on Main() 165Parameters 168

    Value Parameters 168Reference Parameters (ref) 170Output Parameters (out) 171

    Parameter Arrays (params) 173

    Recursion 176Method Overloading 179Optional Parameters 182Basic Error Handling with Exceptions 186

    Trapping Errors 187Reporting Errors Using a throwStatement 196

    Summary 199

    5 Classes 201

    Declaring and Instantiating a Class 205Instance Fields 209

    Declaring an Instance Field 209Accessing an Instance Field 210

    Instance Methods 211Using the this Keyword 213

    Access Modifiers 220Properties 222

    Declaring a Property 223Automatically Implemented Properties 225

    Naming Conventions 227Using Properties with Validation 228Read-Only and Write-Only Properties 230Access Modifiers on Getters and Setters 231Properties as Virtual Fields 232Properties and Method Calls Not Allowed as refor out

    Parameter Values 234

    Constructors 236Declaring a Constructor 237Default Constructors 239Object Initializers 239

  • 8/3/2019 Essential.csharp.4.0

    11/975

    Contents xv

    Overloading Constructors 241Constructor Chaining: Calling another

    Constructor Using this 243

    Static Members 247Static Fields 248Static Methods 251Static Constructors 253

    Static Properties 254Static Classes 255

    Extension Methods 256Encapsulating the Data 258

    const 258

    readonly 259Nested Classes 260Partial Classes 262

    Defining a Partial Class 263Partial Methods 264

    Summary 267

    6 Inheritance 269

    Derivation 270Casting between Base and Derived Types 272

    private Access Modifier 275protectedAccess Modifier 276

    Extension Methods 278Single Inheritance 278Sealed Classes 281

    Overriding the Base Class 281virtual Modifier 282

    newModifier 286sealedModifier 291base Member 291Constructors 292

    Abstract Classes 293All Classes Derive from System.Object 299Verifying the Underlying Type with the is Operator 301Conversion Using the as Operator 302

    Summary 303

    7 Interfaces 305

    Introducing Interfaces 306Polymorphism through Interfaces 307Interface Implementation 312

  • 8/3/2019 Essential.csharp.4.0

    12/975

    Contents

    Explicit Member Implementation 314Implicit Member Implementation 315Explicit versus Implicit Interface Implementation 316

    Converting between the Implementing Class and ItsInterfaces 318Interface Inheritance 318Multiple Interface Inheritance 321Extension Methods on Interfaces 322Implementing Multiple Inheritance via Interfaces 323Versioning 326Interfaces Compared with Classes 328

    Summary 329

    8 Value Types 331

    Structs 332Initializing structs 336Using the default Operator 338Inheritance and Interfaces with Value Types 338

    Boxing 339

    Enums 346Type Compatibility between Enums 349Converting between Enums and Strings 350Enums as Flags 351

    Summary 356

    9 Well-Formed Types 357

    Overriding object Members 357Overriding ToString() 358Overriding GetHashCode() 358Overriding Equals() 361Guidelines for Implementing Equality 369

    Operator Overloading 369Comparison Operators (==, !=, , =) 370Binary Operators (+, -, *, /, %, &, |, ^, ) 371Combining Assignment with Binary Operators (+=, -=, *=, /=, %=, &=) 373Conditional Logical Operators (&&, ||) 373

    Unary Operators (+, -, !, ~, ++, --, true,false) 373Conversion Operators 375Guidelines for Conversion Operators 377

    Referencing Other Assemblies 377Changing the Assembly Target 378Referencing an Assembly 379Encapsulation of Types 379

  • 8/3/2019 Essential.csharp.4.0

    13/975

    Contents xvii

    Defining Namespaces 382Namespace Alias Qualifier 384

    XML Comments 385

    Associating XML Comments with Programming Constructs 386Generating an XML Documentation File 388

    Garbage Collection 390Weak References 391

    Resource Cleanup 393Finalizers 393Deterministic Finalization with the using Statement 395Garbage Collection and Finalization 398Resource Utilization and Finalization Guidelines 400

    Lazy Initialization 400Summary 403

    10 Exception Handling 405

    Multiple Exception Types 405Catching Exceptions 407General Catch Block 409Guidelines for Exception Handling 411Defining Custom Exceptions 414Summary 419

    11 Generics 421

    C# without Generics 422Introducing Generic Types 427

    Using a Generic Class 427Defining a Simple Generic Class 429Benefits of Generics 430

    Type Parameter Naming Guidelines 431Generic Interfaces and Structs 432Defining a Constructor and a Finalizer 434Specifying a Default Value 435Multiple Type Parameters 436Arity in Abundance 437

    Nested Generic Types 438

    Constraints 439Interface Constraints 442Base Class Constraints 444struct/class Constraints 445Multiple Constraints 446Constructor Constraints 446Constraint Inheritance 447

  • 8/3/2019 Essential.csharp.4.0

    14/975

    Contents

    Generic Methods 453Type Inferencing 454Specifying Constraints 455

    Covariance and Contravariance 457Enabling Covariance with the out Type Parameter Modifier in C# 4.0 458Enabling Contravariance with the in Type Parameter Modifier in C# 4.0 460

    Support for Parameter Covariance and Contravariance in Arrays 462

    Generic Internals 463Instantiating Generics Based on Value Types 464Instantiating Generics Based on Reference Types 465

    Summary 467

    12 Delegates and Lambda Expressions 469Introducing Delegates 470

    Defining the Scenario 470

    Delegate Data Types 472Delegate Internals 473Defining a Delegate Type 474Instantiating a Delegate 475

    Anonymous Methods 480

    System-Defined Delegates: Func 483Lambda Expressions 486

    Statement Lambdas 486Expression Lambdas 489Outer Variables 495Expression Trees 498

    Summary 506

    13 Events 507

    Coding the Observer Pattern with Multicast Delegates 508Defining Subscriber Methods 508Defining the Publisher 510Hooking Up the Publisher and Subscribers 511Invoking a Delegate 512Check for null 513Delegate Operators 514Sequential Invocation 516

    Error Handling 519Method Returns and Pass-by-Reference 522

    Events 523Why Events? 523Declaring an Event 525Coding Conventions 526

  • 8/3/2019 Essential.csharp.4.0

    15/975

    Contents xix

    Generics and Delegates 528Customizing the Event Implementation 532

    Summary 533

    14 Collection Interfaces with Standard Query Operators 535

    Anonymous Types and Implicitly Typed Local Variables 536Anonymous Types 537Implicitly Typed Local Variables (var) 538More about Anonymous Types and Implicit Local Variables 540

    Collection Initializers 543What Makes a Class a Collection: IEnumerable 546

    foreach with Arrays 546foreach with IEnumerable 547

    Do Not Modify Collections duringforeach Iteration 552

    Standard Query Operators 552Filtering with Where() 556Projecting with Select() 557Counting Elements with Count() 561Deferred Execution 562

    Sorting with OrderBy() and ThenBy() 566

    Performing an Inner Join with Join() 572Grouping Results with GroupBy() 575Implementing a One-to-Many Relationship with GroupJoin() 577Calling SelectMany() 580More Standard Query Operators 582

    Summary 586

    15 LINQ with Query Expressions 589

    Introducing Query Expressions 590Projection 592Filtering 598Sorting 599The Let Clause 600Grouping 602

    Query Continuation with into 605

    Query Expressions as Method Invocations 608Summary 609

    16 Building Custom Collections 611

    More Collection Interfaces 612IList versus IDictionary 614IComparable 614

    ICollection 616

  • 8/3/2019 Essential.csharp.4.0

    16/975

    Contents

    Primary Collection Classes 617List Collections: List 617Dictionary Collections: Dictionary 622

    Sorted Collections: SortedDictionary andSortedList 626Stack Collections: Stack 628Queue Collections: Queue 629Linked Lists: LinkedList 629

    Providing an Index Operator 630Returning Null or an Empty Collection 634Iterators 634

    Defining an Iterator 636

    Iterator Syntax 636Yielding Values from an Iterator 637Iterators and State 639More Iterator Examples 641Placing ayield return within a Loop 643Canceling Further Iteration:yield break 645Creating Multiple Iterators in a Single Class 648

    yieldStatement Characteristics 649

    Summary 650

    17 Reflection, Attributes, and Dynamic Programming 651

    Reflection 652Accessing Metadata Using System.Type 653Member Invocation 655Reflection on Generic Types 660

    Attributes 663Custom Attributes 666

    Looking for Attributes 667Initializing an Attribute through a Constructor 668System.AttributeUsageAttribute 673Named Parameters 674

    Programming with Dynamic Objects 688Invoking Reflection Using dynamic 689dynamic Principles and Behaviors 690Why Dynamic Binding? 694

    Static Compilation versus Dynamic Programming 695Implementing a Custom Dynamic Object 696

    Summary 699

  • 8/3/2019 Essential.csharp.4.0

    17/975

    Contents xxi

    18 Multithreading 701

    Running and Controlling a Separate Thread 706ContinueWith() 711

    Unhandled Exception Handling on Task 715Canceling a Task 718Long-Running Tasks 722Disposing a Task 723

    Executing Iterations in Parallel 724Parallel Exception Handling with System.AggregateException 728Canceling a Parallel Loop 729

    Running LINQ Queries in Parallel 734Canceling a PLINQ Query 736

    Multithreading before .NET Framework 4 738Asynchronous Operations with System.Threading.Thread 738Thread Management 740Thread Pooling 742

    Unhandled Exceptions on the AppDomain 744Summary 746

    19 Synchronization and More Multithreading Patterns 749

    Synchronization 750Synchronization UsingMonitor 754Using the lock Keyword 757Choosing a lock Object 758Why to Avoid Locking on this, typeof(type), and string 759Declaring Fields as volatile 760Using the System.Threading.InterlockedClass 761Event Notification with Multiple Threads 763Synchronization Design Best Practices 764More Synchronization Types 766Thread Local Storage 774

    Timers 778Asynchronous Programming Model 783

    Calling the APM 784Calling the APM Using TPL 791

    Asynchronous Delegate Invocation 797Passing Data to and from an Alternate Thread 799

    Event-Based Asynchronous Pattern (EAP) 801Background Worker Pattern 804

    Establishing the Pattern 807Exception Handling 808

  • 8/3/2019 Essential.csharp.4.0

    18/975

  • 8/3/2019 Essential.csharp.4.0

    19/975

    Contents xxiii

    Base Class Library (BCL) 860Metadata 860Summary 862

    A Downloading and Installing the C# Compiler and the CLI

    Platform 865

    B Full Source Code Listings 869

    C Concurrent Classes from System.Collections.Concurrent 895

    D C# 2.0 Topics 899

    E C# 3.0 Topics 903

    F C# 4.0 Topics 905

    Index 907

  • 8/3/2019 Essential.csharp.4.0

    20/975

    This page intentionally left blank

  • 8/3/2019 Essential.csharp.4.0

    21/975

  • 8/3/2019 Essential.csharp.4.0

    22/975

    Contents of C# 4.0 Topics

    Long-Running Threads 722Disposing Tasks 723

    Executing Iterations in Parallel 724

    Parallel Exception Handling withSystem.AggregateException 728Canceling Parallel Loops 729Running LINQ Queries in Parallel 734Multithreading, Unhandled Exceptions on AppDomain 744

    19 Synchronization and More Multithreading Patterns 749

    Monitor Class Synchronization 754

    lock Keyword 757Reset Events 768ManualResetEvent and Semaphores over AutoReset Event 772Concurrent Collection Classes 773Thread Local Storage 774Calling APMs (Asynchronous Programming

    Models) Using TPL (Task Parallel Library) 791Asynchronous Delegate Invocation 797

  • 8/3/2019 Essential.csharp.4.0

    23/975

    xxvii

    Figures

    Figure 2.1: Value Types Contain the Data Directly 55Figure 2.2: Reference Types Point to the Heap 56

    Figure 3.1: Corresponding Placeholder Values 115Figure 3.2: Calculating the Value of an Unsigned Byte 116Figure 3.3: Calculating the Value of a Signed Byte 116

    Figure 3.4: The Numbers 12 and 7 Represented in Binary 118Figure 3.5: Collapsed Region in Microsoft Visual Studio .NET 145

    Figure 4.1: Exception-Handling Program Flow 190

    Figure 5.1: Class Hierarchy 204

    Figure 6.1: Refactoring into a Base Class 271Figure 6.2: Working around Multiple Inheritance Using Aggregation 280

    Figure 7.1: Working around Single Inheritances with Aggregation andInterfaces 326

    Figure 8.1: Value Types Contain the Data Directly 332Figure 8.2: Reference Types Point to the Heap 333

    Figure 9.1: Identity 362

    Figure 9.2: XML Comments as Tips in Visual Studio IDE 386

    Figure 12.1: Delegate Types Object Model 474Figure 12.2: Anonymous Function terminology 486Figure 12.3: Object Graph of a Lambda Expression 500Figure 12.4: Object Graph of Unary and Binary Expressions 501

  • 8/3/2019 Essential.csharp.4.0

    24/975

    Figures

    Figure 13.1: Delegate Invocation Sequence Diagram 517Figure 13.2: Multicast Delegates Chained Together 518Figure 13.3: Delegate Invocation with Exception Sequence Diagram 520

    Figure 14.1: IEnumerator and IEnumerator Interfaces 548Figure 14.2: IEnumerator and IEnumerator Interfaces 564Figure 14.3: Venn Diagram of Inventor and Patent Collections 569

    Figure 16.1: Generic Collection Interface Hierarchy 613Figure 16.2: List Class Diagrams 618Figure 16.3: Dictionary Class Diagrams 622Figure 16.4: SortedList and SortedDictionary Class

    Diagrams 627Figure 16.5: Stack Class Diagram 629Figure 16.6: Queue Class Diagram 629Figure 16.7: LinkedList and LinkedListNode Class

    Diagrams 630Figure 16.8: Sequence Diagram withyield return 640

    Figure 17.1: MemberInfo Derived Classes 660Figure 17.2:

    BinaryFormatter Does Not Encrypt Data 683

    Figure 18.1: Clock Speeds over Time 702Figure 18.2: CancellationTokenSource and CancellationTokenClass

    Diagrams 721

    Figure 19.1: APM Parameter Distribution 786Figure 19.2: Delegate Parameter Distribution to BeginInvoke() and

    EndInvoke() 800

    Figure 20.1: Pointers Contain the Address of the Data 832

    Figure 21.1: Compiling C# to Machine Code 848Figure 21.2: Assemblies with the Modules and Files They Reference 856

  • 8/3/2019 Essential.csharp.4.0

    25/975

    xxix

    Tables

    Table 1.1: C# Keywords 5Table 1.2: C# Comment Types 21Table 1.3: C# and .NET Versions 26

    Table 2.1: Integer Types 32Table 2.2: Floating-Point Types 33

    Table 2.3: decimal Type 34Table 2.4: Escape Characters 42Table 2.5: string Static Methods 46Table 2.6: string Methods 47Table 2.7: Common Array Coding Errors 79

    Table 3.1: Control Flow Statements 99Table 3.2: Relational and Equality Operators 110Table 3.3: Conditional Values for the XOR Operator 113Table 3.4: Preprocessor Directives 139Table 3.5: Operator Order of Precedence 146

    Table 4.1: Common Namespaces 153Table 4.2: Common Exception Types 193

    Table 6.1: Why the New Modifier? 287Table 6.2: Members ofSystem.Object 299

    Table 7.1: Comparing Abstract Classes and Interfaces 328

    Table 8.1: Boxing Code in CIL 340

    Table 9.1: Accessibility Modifiers 381

  • 8/3/2019 Essential.csharp.4.0

    26/975

  • 8/3/2019 Essential.csharp.4.0

    27/975

  • 8/3/2019 Essential.csharp.4.0

    28/975

  • 8/3/2019 Essential.csharp.4.0

    29/975

    Foreword xxxiii

    read. Mark selects his topics with care, and explains them in the simplest

    possible terms. He knows what needs to be included, and what can be left

    out. If he wants to explore an advanced topic, he clearly sets it apart from

    the rest of the text. He never shows off by first parading his intellect at the

    expense of our desire to understand.

    A centrally important part of this new edition of the book continues to

    be its coverage of LINQ. For many developers the declarative style of pro-

    gramming used by LINQ is a new technology that requires developing

    new habits and new ways of thinking.

    C# 3.0 contained several new features that enable LINQ. A main goal of

    the book is to lay out these features in detail. Explaining LINQ and the

    technologies that enable it is no easy task, and Mark has rallied all his for-

    midable skills as a writer and teacher to lay this technology out for the

    reader in clear and easy-to-understand terms.

    All the key technologies that you need to know if you want to under-

    stand LINQ are carefully explained in this text. These include

    Partial methods

    Automatic properties

    Object initializers

    Collection initializers

    Anonymous types

    Implicit local variables (var)

    Lambdas

    Extension methods

    Expression trees

    IEnumerable and IQueryable

    LINQ query operators

    Query expressions

    The march to an understanding of LINQ begins with Marks explana-

    tions of important C# 2.0 technologies such as generics and delegates. He

    then walks you step by step through the transition from delegates to lamb-

    das. He explains why lambdas are part of C# 3.0 and the key role they play

  • 8/3/2019 Essential.csharp.4.0

    30/975

  • 8/3/2019 Essential.csharp.4.0

    31/975

    xxxv

    Preface

    THROUGHOUT THE HISTORY of software engineering, the methodology used

    to write computer programs has undergone several paradigm shifts, each

    building on the foundation of the former by increasing code organization

    and decreasing complexity. This book takes you through these same para-

    digm shifts.

    The beginning chapters take you through sequential programmingstructure, in which statements are written in the order in which they are

    executed. The problem with this model is that complexity increases expo-

    nentially as the requirements increase. To reduce this complexity, code

    blocks are moved into methods, creating a structured programming

    model. This allows you to call the same code block from multiple locations

    within a program, without duplicating code. Even with this construct,

    however, programs quickly become unwieldy and require further abstrac-tion. Object-oriented programming, discussed in Chapter 5, was the

    response. In subsequent chapters, you will learn about additional method-

    ologies, such as interface-based programming, LINQ (and the transforma-

    tion it makes to the collection API), and eventually rudimentary forms of

    declarative programming (in Chapter 17) via attributes.

    This book has three main functions.

    1. It provides comprehensive coverage of the C# language, going

    beyond a tutorial and offering a foundation upon which you can

    begin effective software development projects.

  • 8/3/2019 Essential.csharp.4.0

    32/975

  • 8/3/2019 Essential.csharp.4.0

    33/975

    Preface xxxvii

    trains you in good programming practices that will serve you

    throughout your programming career.

    Structured programmers: Just as its best to learn a foreign language

    through immersion, learning a computer language is most effective

    when you begin using it before you know all the intricacies. In this

    vein, this book begins with a tutorial that will be comfortable for

    those familiar with structured programming, and by the end of Chap-

    ter 4, developers in this category should feel at home writing basic

    control flow programs. However, the key to excellence for C# devel-

    opers is not memorizing syntax. To transition from simple programs

    to enterprise development, the C# developer must think natively in

    terms of objects and their relationships. To this end, Chapter 5s

    Beginner Topics introduce classes and object-oriented development.

    The role of historically structured programming languages such as C,

    COBOL, and FORTRAN is still significant but shrinking, so it

    behooves software engineers to become familiar with object-oriented

    development. C# is an ideal language for making this transition

    because it was designed with object-oriented development as one of

    its core tenets.

    Object-based and object-oriented developers: C++ and Java programmers,

    and many experienced Visual Basic programmers, fall into this cate-

    gory. Many of you are already completely comfortable with semico-

    lons and curly braces. A brief glance at the code in Chapter 1 reveals

    that at its core, C# is similar to the C and C++ style languages that you

    already know.

    C# professionals: For those already versed in C#, this book provides a

    convenient reference for less frequently encountered syntax. Further-

    more, it provides answers to language details and subtleties that are

    seldom addressed. Most importantly, it presents the guidelines and

    patterns for programming robust and maintainable code. This book

    also aids in the task of teaching C# to others. With the emergence ofC# 3.0 and C# 4.0, some of the most prominent enhancements are:

    Implicitly typed variables (see Chapter 2)

    Extension methods (see Chapter 5)

    Partial methods (see Chapter 5)

  • 8/3/2019 Essential.csharp.4.0

    34/975

  • 8/3/2019 Essential.csharp.4.0

    35/975

    Preface xxxix

    Here is a sample code listing.

    Listing 1.17: Commenting Your Code

    }

    }

    The formatting is as follows.

    Comments are shown in italics.

    /* Display a greeting to the console

    using composite formatting. */

    Keywords are shown in bold.

    static void Main()

    Highlighted code calls out specific code snippets that may have

    changed from an earlier listing, or demonstrates the concept

    described in the text.

    class CommentSamples{

    static void Main()

    {

    string firstName;// Variable for storing the first name

    string lastName; // Variable for storing the last name

    single-line comment

    System.Console.WriteLine("Hey you!");

    System.Console.Write/* No new line */(

    "Enter your first name: ");

    firstName = System.Console.ReadLine();

    System.Console.Write/* No new line */(

    "Enter your last name: ");

    lastName = System.Console.ReadLine();

    /* Display a greeting to the console

    using composite formatting. */

    System.Console.WriteLine("Your full name is {0} {1}.",

    firstName, lastName);

    // This is the end

    // of the program listing

    delimited comment inside statement

    delimited comment

  • 8/3/2019 Essential.csharp.4.0

    36/975

    Preface

    Highlighting can appear on an entire line or on just a few characters

    within a line.

    System.Console.WriteLine(

    Incomplete listings contain an ellipsis to denote irrelevant code that

    has been omitted.

    // ...

    Console output is the output from a particular listing that appears fol-

    lowing the listing.

    User input for the program appears in italics.

    Although it might have been convenient to provide full code samples

    that you could copy into your own programs, doing so would detract you

    from learning a particular topic. Therefore, you need to modify the code

    samples before you can incorporate them into your programs. The core

    omission is error checking, such as exception handling. Also, code samples

    do not explicitly include using Systemstatements. You need to assume the

    statement throughout all samples.

    You can find sample code and bonus mateial at intelliTechture.com/

    EssentialCSharp and at informit.com/msdotnetseries.

    Mind MapsEach chapters introduction includes a mind map, which serves as an out-

    line that provides an at-a-glance reference to each chapters content. Here

    is an example (taken from Chapter 5).

    System.Console.Write/* No new line */(

    "Your full name is {0} {1}.",

    OUTPUT1.4:

    >HeyYou.exe

    Hey you!

    Enter your first name: Inigo

    Enter your last name: Montoya

  • 8/3/2019 Essential.csharp.4.0

    37/975

    Preface xli

    The theme of each chapter appears in the mind maps center. High-level

    topics spread out from the core. Mind maps allow you to absorb the flowfrom high-level to more detailed concepts easily, with less chance of

    encountering very specific knowledge that you might not be looking for.

    Helpful Notes

    Depending on your level of experience, special code blocks and tabs will

    help you navigate through the text.

    Beginner Topics provide definitions or explanations targeted specifi-

    cally toward entry-level programmers.

    Advanced Topics enable experienced developers to focus on the

    material that is most relevant to them.

    Callout notes highlight key principles in callout boxes so that readers

    easily recognize their significance.

    Language Contrast sidebars identify key differences between C# andits predecessors to aid those familiar with other languages.

    Declaring a Property

    Naming Conventions

    Using Properties with Validation

    Read-Only and Write-Only Properties

    Access Modifiers on Getters and Setters

    Properties as Virtual Fields

    Properties and Method Calls Not Allowed

    as ref or out Parameter Values

    InstanceFields

    Declaring an Instance Field

    Accessing an Instance Field

    Const and readonly Modifiers

    Properties

    Static Fields

    Static Methods

    Static Constructors

    Static Classes

    Partial Classes

    Nested Classes

    Classes

    2

    3 Instance Methods

    4

    5

    Static7

    Access Modifiers

    9 Special ClassesDeclaring and Instantiating a Class1

    8 Extension Methods

    Declaring a Constructor

    Default Constructors

    Overloading Constructors

    Calling one Constructor Using this

    Finalizers

    Constructors& Finalizers

    6

  • 8/3/2019 Essential.csharp.4.0

    38/975

    Preface

    How This Book Is Organized

    At a high level, software engineering is about managing complexity, and it

    is toward this end that I have organized Essential C# 4.0 Chapters 14 intro-duce structured programming, which enable you to start writing simple

    functioning code immediately. Chapters 59 present the object-oriented

    constructs of C#. Novice readers should focus on fully understanding this

    section before they proceed to the more advanced topics found in the

    remainder of this book. Chapters 1113 introduce additional complexity-

    reducing constructs, handling common patterns needed by virtually all

    modern programs. This leads to dynamic programming with reflectionand attributes, which is used extensively for threading and interoperability

    in the chapters that follow.

    The book ends with a chapter on the Common Language Infrastructure,

    which describes C# within the context of the development platform in

    which it operates. This chapter appears at the end because it is not C# spe-

    cific and it departs from the syntax and programming style in the rest of

    the book. However, this chapter is suitable for reading at any time, perhapsmost appropriately immediately following Chapter 1.

    Here is a description of each chapter (in this list, chapter numbersshown in bold indicate the presence of C# 3.0 or C# 4.0 material).

    Chapter 1Introducing C#: After presenting the C# HelloWorld pro-

    gram, this chapter proceeds to dissect it. This should familiarize read-

    ers with the look and feel of a C# program and provide details on how

    to compile and debug their own programs. It also touches on the con-

    text of a C# programs execution and its intermediate language.

    Chapter 2Data Types: Functioning programs manipulate data, and

    this chapter introduces the primitive data types of C#. This includes

    coverage of two type categories, value types and reference types,

    along with conversion between types and support for arrays.

    Chapter 3Operators and Control Flow: To take advantage of theiterative capabilities in a computer, you need to know how to include

    loops and conditional logic within your program. This chapter also

    covers the C# operators, data conversion, and preprocessor

    directives.

    .

  • 8/3/2019 Essential.csharp.4.0

    39/975

    Preface xliii

    Chapter 4Methods and Parameters: This chapter investigates the

    details of methods and their parameters. It includes passing by value,

    passing by reference, and returning data via a parameter. In C# 4.0

    default parameter support was added and this chapter explains how

    to use them.

    Chapter 5Classes: Given the basic building blocks of a class, this

    chapter combines these constructs together to form fully functional

    types. Classes form the core of object-oriented technology by defining

    the template for an object.

    Chapter 6Inheritance: Although inheritance is a programming fun-

    damental to many developers, C# provides some unique constructs,

    such as the new modifier. This chapter discusses the details of the

    inheritance syntax, including overriding.

    Chapter 7Interfaces: This chapter demonstrates how interfaces are

    used to define the versionable interaction contract between classes.

    C# includes both explicit and implicit interface member implementa-

    tion, enabling an additional encapsulation level not supported bymost other languages.

    Chapter 8Value Types: Although not as prevalent as defining refer-

    ence types, it is sometimes necessary to define value types that

    behave in a fashion similar to the primitive types built into C#. This

    chapter describes how to define structures, while exposing the idio-

    syncrasies they may introduce.

    Chapter 9Well-Formed Types: This chapter discusses more advancedtype definition. It explains how to implement operators, such as + and

    casts, and describes how to encapsulate multiple classes into a single

    library. In addition, the chapter demonstrates defining namespaces

    and XML comments, and discusses how to design classes for garbage

    collection.

    Chapter 10Exception Handling: This chapter expands on the excep-

    tion-handling introduction from Chapter 4 and describes how excep-tions follow a hierarchy that enables creating custom exceptions. It

    also includes some best practices on exception handling.

  • 8/3/2019 Essential.csharp.4.0

    40/975

    Preface

    Chapter 11Generics: Generics is perhaps the core feature missing

    from C# 1.0. This chapter fully covers this 2.0 feature. In addition, C#

    4.0 added support for covariance and contravariancesomething

    covered in the context of generics in this chapter.

    Chapter 12Delegates and Lambda Expressions: Delegates begin clearly

    distinguishing C# from its predecessors by defining patterns for han-

    dling events within code. This virtually eliminates the need for writ-

    ing routines that poll. Lambda expressions are the key concept that

    make C# 3.0s LINQ possible. This chapter explains how lambda

    expressions build on the delegate construct by providing a more ele-

    gant and succinct syntax. This chapter forms the foundation for the

    new collection API discussed next.

    Chapter 13Events: Encapsulated delegates, known as events, are a

    core construct of the Common Language Runtime. Anonymous

    methods, another C# 2.0 feature, are also presented here.

    Chapter 14Collection Interfaces with Standard Query Operators: The

    simple and yet elegantly powerful changes introduced in C# 3.0 beginto shine in this chapter as we take a look at the extension methods of

    the new Enumerable class. This class makes available an entirely new

    collection API known as the standard query operators and discussed

    in detail here.

    Chapter 15LINQ with Query Expressions: Using standard query

    operators alone results in some long statements that are hard to deci-

    pher. However, query expressions provide an alternative syntax thatmatches closely with SQL, as described in this chapter.

    Chapter 16Building Custom Collections: In building custom APIs that

    work against business objects, it is sometimes necessary to create cus-

    tom collections. This chapter details how to do this, and in the process

    introduces contextual keywords that make custom collection build-

    ing easier.

    Chapter 17Reflection, Attributes, and Dynamic Programming: Object-oriented programming formed the basis for a paradigm shift in pro-

    gram structure in the late 1980s. In a similar way, attributes facilitate

    declarative programming and embedded metadata, ushering in a

    new paradigm. This chapter looks at attributes and discusses how to

  • 8/3/2019 Essential.csharp.4.0

    41/975

  • 8/3/2019 Essential.csharp.4.0

    42/975

    Preface

    these listings still available to the reader, this appendix includes full list-

    ings from Chapters 3, 11, 12, 14, and 17.

    Appendix CConcurrent Classes from System.Collections.Concur-

    rent: This appendix provides overview diagrams of the concurrent

    collections that were added in the .NET Framework 4.

    Appendixes D-F: C# 2.0, C# 3.0, C# 4.0 Topics: These appendices pro-

    vide a quick reference for any C# 2.0, C# 3.0, or C# 4.0 content. They

    are specifically designed to help programmers quickly get up to

    speed on C# features.

    I hope you find this book to be a great resource in establishing your C#

    expertise and that you continue to reference it for the more obscure areas of

    C# and its inner workings.

    Mark Michaelis

    mark.michaelis.net

  • 8/3/2019 Essential.csharp.4.0

    43/975

    xlvii

    Acknowledgments

    NO BOOK CAN BE published by the author alone, and I am extremely grate-

    ful for the multitude of people who helped me with this one.

    The order in which I thank people is not significant, except for those

    that come first. By far, my family has made the biggest sacrifice to allow me

    to complete this. Benjamin, Hanna, and Abigail often had a Daddy dis-

    tracted by this book, but Elisabeth suffered even more so. She was often leftto take care of things, holding the familys world together on her own. I

    would like to say it got easier with each edition but, alas, no; as the kids got

    older, life became more hectic, and without me Elisabeth was stretched to

    the breaking point virtually all the time. A huge sorry and ginormous

    Thank You!

    Many technical editors reviewed each chapter in minute detail to ensure

    technical accuracy. I was often amazed by the subtle errors these folks stillmanaged to catch: Paul Bramsman, Kody Brown, Ian Davis, Doug Dechow,

    Gerard Frantz, Thomas Heavey, Anson Horton, Brian Jones, Shane

    Kercheval, Angelika Langer, Eric Lippert, John Michaelis, Jason Morse,

    Nicholas Paldino, Jon Skeet, Michael Stokesbary, Robert Stokesbary, John

    Timney, and Stephen Toub.

    In particular, Michael was a huge help in editing the technical content

    and serving as a sounding board as I was putting the material together, notto mention his invaluable friendship. I am also especially grateful to the C#

    MVPs (Nicholas and John), who know the language in certain areas second

    only to those on the C# team.

  • 8/3/2019 Essential.csharp.4.0

    44/975

    Acknowledgments

    Eric is no less than amazing. His grasp of the C# vocabulary is truly

    astounding and I am very appreciative of his edits, especially when he

    pushed for perfection in terminology. His improvements to the C# 3.0

    chapters were incredibly significant, and in the second edition my only

    regret was that I didnt have him review all the chapters. However, that

    regret is no longer. Eric painstakingly reviewed every Essential C# 4.0 chap-

    ter with amazing detail and precision. I am extremely grateful for his con-

    tribution to making this book even better than the first two editions.

    Thanks, Eric! I cant imagine anyone better for the job. You deserve all the

    credit for raising the bar from good to great.

    Like Eric and C#, there are fewer than a handful of people who know

    .NET multithreading as well as Stephen Toub. Accordingly, Stephen

    focused on the two rewritten multithreading chapters and their new focus

    on parallel programming. Stephens feedback in combination with the

    changes that occurred between Beta editions caused me to ask Stephen to

    take a second look after I updated them based on his first reviewhe

    accepted. I truly cant imagine a better person to do the review. Thanks,

    Stephen! Thanks especially for putting up with me as I ramped up on the

    new API.

    Paul and Robert were key technical reviewers for the second edition,

    and they painstakingly recompiled and executed each listing. This was a

    big effort and the errors you found were much appreciated, along with

    your suggestions.

    Thanks to Scott Robertson at UCLA Extension for creating instructional

    materials for this book for university adoption.

    Thanks to everyone at Addison-Wesley for their patience in working

    with me in spite of my frequent focus on everything else except the manu-

    script. Thanks to: Olivia Basegio, Sheri Cain, Curt Johnson, Joan Murray,

    and Brandon Prebynski.

    Joan, thanks also for the weekly telephone calls to keep me on task dur-

    ing the second editionwell, for at least making me feel guilty when I

    wasnt on task. Thanks also for your willingness to put up with me for this

    third edition. I wish I could say that this time I made it less stressful for

    you, but I doubt I did. Thanks!

  • 8/3/2019 Essential.csharp.4.0

    45/975

    Acknowledgments xlix

    Thanks to Audrey Doyle. Anyone who can quote The Chicago Manual of

    Style has to be the right person to have on your team as the copy editor. The

    stuff she noticed and corrected made me wonder whether I am qualified to

    use email. Thanks especially for all the formatting help.

    Prashant Sridharan, from Microsofts Developer Division, was the one

    who got me started on this, and he provided me with an incredible jump-

    start on the material. Thanks, Prashant!

  • 8/3/2019 Essential.csharp.4.0

    46/975

    This page intentionally left blank

  • 8/3/2019 Essential.csharp.4.0

    47/975

    li

    About the Author

    Mark Michaelis recently started IntelliTechture, a software engineering

    and consulting company with high-end skills in Microsoft VSTS/TFS, Biz-

    Talk, SharePoint, and .NET. Mark also serves as a chief software architect

    and trainer for IDesign Inc.

    Mark holds a BA in philosophy from the University of Illinois and an

    MS in computer science from the Illinois Institute of Technology. In 2007,Mark was recognized as a Microsoft Regional Director. Since 1996, he has

    been a Microsoft MVP for C#, Visual Studio Team System, and the Win-

    dows SDK. He serves on several Microsoft software design review teams,

    including C#, the Connected Systems Division, and VSTS. Mark speaks at

    developer conferences and has written numerous articles and books.

    When not bonding with his computer, Mark is busy with his family or

    training for another triathlon (having completed the Ironman in 2008).Mark lives in Spokane, Washington, with his wife Elisabeth, and three chil-

    dren, Benjamin, Hanna, and Abigail.

  • 8/3/2019 Essential.csharp.4.0

    48/975

  • 8/3/2019 Essential.csharp.4.0

    49/975

    1

    1Introducing C#

    IS NOW A WELL-ESTABLISHED LANGUAGE that builds on fea-

    tures found in its predecessor C-style languages (C, C++, and

    Java), making it immediately familiar to many experienced programmers.1

    Part of a larger, more complex execution platform called the Common Lan-guage Infrastructure (CLI), C# is a programming language for building

    software components and applications.

    This chapter introduces C# using the traditional HelloWorld program.The chapter focuses on C# syntax fundamentals, including defining an

    entry point into the C# program executable. This will familiarize you with

    1. It has now been more than ten years since the first C# design meeting.

    C#

    2

    34

    5

    6 1

    Introducing C#

    Hello, World Compiling and Running

    Managed Execution

    C# SyntaxFundamentals

    Keywords

    Main

    Statements

    Whitespace

    Working withVariables

    Declaration

    Assignment

    Use

    Console Inputand Output

    CommentsSingle Line

    Delimited

    Common IntermediateLanguage and ILDASM

  • 8/3/2019 Essential.csharp.4.0

    50/975

  • 8/3/2019 Essential.csharp.4.0

    51/975

  • 8/3/2019 Essential.csharp.4.0

    52/975

    Chapter 1: Introducing C#

    independently, developers can create a library of code that can be

    referenced by another, larger program. Libraries (or class libraries) use the

    filename extension .dll, which stands for Dynamic Link Library (DLL). A

    library is also an assembly. In other words, the output from a successful C#

    compile is an assembly regardless of whether it is a program or a library.

    C# Syntax Fundamentals

    Once you successfully compile and run the HelloWorld program, you are

    ready to start dissecting the code to learn its individual parts. First, con-

    sider the C# keywords along with the identifiers that the developer

    chooses.

    B E G I N N E R T O P I C

    KeywordsIn order for the compiler to interpret the code, certain words within C#

    have special status and meaning. Known as keywords or reserved words,

    they provide the concrete syntax that the compiler uses to interpret the

    expressions the programmer writes. In the HelloWorld program, class,

    static, and void are examples of keywords.

    The compiler uses the keywords to identify the structure and organiza-

    tion of the code. Because the compiler interprets these words with elevatedsignificance, you can use keywords only under the specific rules identified

    by the language. In other words, programming languages require that

    developers place keywords only in certain locations. When programmers

    violate these rules, the compiler will issue errors.

    Language Contrast: JavaFilename Must Match Class Name

    In Java, the filename must follow the name of the class. In C#, this conven-

    tion is frequently followed but is not required. In C#, it is possible to havetwo classes in one file, and starting with C# 2.0, its possible to have a

    single class span multiple files.

  • 8/3/2019 Essential.csharp.4.0

    53/975

    C# Syntax Fundamentals 5

    C# Keywords

    Table 1.1 shows the C# keywords.

    TABLE 1.1: C# Keywords

    abstract add* alias* as

    ascending* base bool break

    by* byte case catch

    char checked class const

    continue decimal default delegate

    descending* do double dynamic*

    else enum equals* event

    explicit extern false finally

    fixed float for foreach

    from* get* global* goto

    group* if implicit in

    int interface internal into*

    is join* let* lock

    long namespace new null

    object on* operator orderby*

    out override params partial*

    private protected public readonly

    ref remove* return sbyte

    sealed select* set* short

    sizeof stackalloc static string

    struct switch this throw

    true try typeof uint

    * Contextual keyword Continues

  • 8/3/2019 Essential.csharp.4.0

    54/975

  • 8/3/2019 Essential.csharp.4.0

    55/975

    C# Syntax Fundamentals 7

    than arbitrary. A keen ability to select succinct and indicative names is an

    important characteristic of a strong programmer because the resultant

    code is easier to understand and reuse. In some rare cases, some identifi-

    ers, such as Main, can have a special meaning in the C# language.

    A D V A N C E D T O P I C

    Keywords

    Although it is rare, keywords may be used as identifiers if they include

    @ as a prefix. For example, you could name a local variable @return.Similarly (although it doesnt conform to the casing standards of C#

    coding standards), it is possible to name a method @throw().

    There are also four undocumented reserved keywords in the Microsoft

    implementation: __arglist, __makeref, __reftype, and __refvalue.

    These are required only in rare interop scenarios and you can ignore them

    for all practical purposes.

    Type Definition

    All code in C# appears within a type definition, and the most common

    type definition begins with the keyword class. A class definition is the

    section of code that generally begins with class identifier { ... }, as

    shown in Listing 1.2.

    Listing 1.2: Basic Class Declaration

    class HelloWorld

    {

    ...

    }

    The name used for the type (in this case, HelloWorld) can vary, but by

    convention, it should begin with a capital letter and a noun. If the name

    contains multiple words appended together, then each additional word

    should also begin with a capital letter. For this particular example, there-

    fore, other possible names are Greetings, HelloInigoMontoya, Hello, or

    simply Program. (Program works especially if it is the class that contains

    the Main() method described next.) The CLI creators called this type of

    casing Pascal casing because of its popularity in the Pascal programming

  • 8/3/2019 Essential.csharp.4.0

    56/975

    Chapter 1: Introducing C#

    language. The alternative, camel casing, follows the same convention,

    except that the first letter is lowercase. Examples include quotient, first-

    Name, and theDreadPirateRoberts.

    Generally, programs contain multiple types, each containing multiple

    methods.

    Main

    B E G I N N E R T O P I C

    What Is a Method?Syntactically, a method in C# is a named block of code introduced by a

    method declaration (for example, static void Main()) and followed by

    zero or more statements within curly braces. Methods perform computa-

    tions and/or actions. Similar to paragraphs in written languages, methods

    provide a means of structuring and organizing code so that it is more read-

    able. More importantly, methods avoid the need to duplicate code. The

    method declaration introduces the method and defines the method namealong with the data passed to and from the method. In Listing 1.3, Main()

    followed by { ... } is an example of a C# method.

    The location where C# programs begin execution is the Main method,

    which begins with static void Main(). When you execute the program

    by typing HelloWorld.exe at the command console, the program starts up,

    resolves the location of Main, and begins executing the first statementwithin Listing 1.3.

    Listing 1.3: Breaking Apart HelloWorld

    class HelloWorld

    {

    staticvoid Main()

    {

    System.Console.WriteLine("Hello, My name is Inigo Montoya");

    }

    }

    Although the Main method declaration can vary to some degree, static

    and the method name, Main, are always required for a program.

    Method DeclarationClassDefinition

    Main

    Statement

  • 8/3/2019 Essential.csharp.4.0

    57/975

    C# Syntax Fundamentals 9

    A D V A N C E D T O P I C

    Declaration of the Main Method

    Although it is possible to declare the Main method without parameters ora return type, C# supports specifying either one. Listing 1.4 shows the full

    declaration of the Main method.

    Listing 1.4: The Main Method, with Parameters and a Return

    static int Main(string[] args)

    {

    ...

    }

    The args parameter is an array of strings corresponding to the command-

    line arguments. However, the first element of the array is not the program

    name but the first command-line parameter to appear after the executable

    name, unlike in C and C++. To retrieve the full command used to execute

    the program use System.Environment.CommandLine.

    The int return from Main is the status code and it indicates the success

    of the programs execution. A return of a nonzero value generally indicates

    an error.

    The designation of the Main method as static indicates that other

    methods may call it directly off the class definition. Without the static

    designation, the command console that started the program would need to

    perform additional work (known as instantiation) before calling themethod. (Chapter 5 contains an entire section devoted to the topic of static

    members.)

    Language Contrast: C++/Javamain() Is All Lowercase

    Unlike its C-style predecessors, C# uses an uppercase for the Main

    method in order to be consistent with the Pascal-based naming conven-tions of C#.

    M

  • 8/3/2019 Essential.csharp.4.0

    58/975

  • 8/3/2019 Essential.csharp.4.0

    59/975

  • 8/3/2019 Essential.csharp.4.0

    60/975

  • 8/3/2019 Essential.csharp.4.0

    61/975

  • 8/3/2019 Essential.csharp.4.0

    62/975

    Chapter 1: Introducing C#

    B E G I N N E R T O P I C

    What Is a Data Type?

    The type of data that a variable declaration specifies is called a data type(or object type). A data type, or simply type, is a classification of things that

    share similar characteristics and behavior. For example, animal is a type. It

    classifies all things (monkeys, warthogs, and platypuses) that have animal

    characteristics (multicellular, capacity for locomotion, and so on). Simi-

    larly, in programming languages, a type is a definition for several items

    endowed with similar qualities.

    Declaring a Variable

    In Listing 1.9, string max is a variable declaration of a string type whose

    name is max. It is possible to declare multiple variables within the same

    statement by specifying the data type once and separating each identifier

    with a comma. Listing 1.10 demonstrates this.

    Listing 1.10: Declaring Two Variables within One Statement

    string message1, message2;

    Because a multivariable declaration statement allows developers to pro-

    vide the data type only once within a declaration, all variables will be of

    the same type.

    In C#, the name of the variable may begin with any letter or an under-

    score (_), followed by any number of letters, numbers, and/or under-

    scores. By convention, however, local variable names are camel-cased (the

    first letter in each word is capitalized, except for the first word) and do not

    include underscores.

    Assigning a Variable

    After declaring a local variable, you must assign it a value before referenc-

    ing it. One way to do this is to use the = operator, also known as the simple

    assignment operator. Operators are symbols used to identify the functionthe code is to perform. Listing 1.11 demonstrates how to use the assign-

    ment operator to designate the string values to which the variables max7

    and valerie will point.

    7. I am not using max to mean the math function here; Im using it as a variable name.

  • 8/3/2019 Essential.csharp.4.0

    63/975

    Working with Variables 15

    Listing 1.11: Changing the Value of a Variable

    class MiracleMax

    {

    static void Main(){

    string valerie;

    System.Console.WriteLine(max);

    System.Console.WriteLine(valerie);

    System.Console.WriteLine(max);}

    }

    From this listing, observe that it is possible to assign a variable as part of

    the variable declaration (as it was for max), or afterward in a separate state-

    ment (as with the variable valerie). The value assigned must always be

    on the right side.

    Running the compiled MiracleMax.exe program produces the codeshown in Output 1.3.

    C# requires that developers assign a local variable before accessing it.

    Additionally, an assignment returns a value. Therefore, C# allows two

    assignments within the same statement, as demonstrated in Listing 1.12.

    Listing 1.12: Assignment Returning a Value That Can Be Assigned Again

    class MiracleMax

    {

    static void Main()

    {

    // ...

    string requirements, max;

    requirements = max = "It would take a miracle.";

    string max = "Have fun storming the castle!";

    valerie = "Think it will work?";

    max = "It would take a miracle.";

    OUTPUT 1.3:

    >MiracleMax.exe

    Have fun storming the castle!

    Think it will work?

    It would take a miracle.

  • 8/3/2019 Essential.csharp.4.0

    64/975

    Chapter 1: Introducing C#

    // ...

    }

    }

    Using a Variable

    The result of the assignment, of course, is that you can then refer to the

    value using the variable identifier. Therefore, when you use the variable

    max within the System.Console.WriteLine(max) statement, the program

    displays Have fun storming the castle!, the value ofmax, on the console.

    Changing the value of max and executing the same System.Console.

    WriteLine(max) statement causes the new max value, It would take amiracle., to be displayed.

    A D V A N C E D T O P I C

    Strings Are Immutable

    All data of type string, whether string literals or otherwise, is immutable

    (or unmodifiable). For example, it is not possible to change the string"Come

    As You Are" to "Come As You Age". A change such as this requires that you

    reassign the variable to point to a new location in memory, instead of mod-

    ifying the data to which the variable originally referred.

    Console Input and Output

    This chapter already used System.Console.WriteLine repeatedly for writ-ing out text to the command console. In addition to being able to write out

    data, a program needs to be able to accept data that a user may enter.

    Getting Input from the Console

    One of the ways to retrieve text that is entered at the console is to use

    System.Console.ReadLine(). This method stops the program execution so

    that the user can enter characters. When the user presses the Enter key, cre-ating a newline, the program continues. The output, also known as the

    return, from the System.Console.ReadLine() method is the string of text

    that was entered. Consider Listing 1.13 and the corresponding output

    shown in Output 1.4.

  • 8/3/2019 Essential.csharp.4.0

    65/975

    Console Input and Output 17

    Listing 1.13: UsingSystem.Console.ReadLine()

    class HeyYou

    {

    static void Main(){

    string firstName;

    string lastName;

    System.Console.WriteLine("Hey you!");

    System.Console.Write("Enter your first name: ");

    firstName = System.Console.ReadLine();

    System.Console.Write("Enter your last name: ");lastName = System.Console.ReadLine();

    ...

    }

    }

    After each prompt, this program uses the System.Console.ReadLine()

    method to retrieve the text the user entered and assign it to an appropriate

    variable. By the time the second System.Console.ReadLine() assignment

    completes, firstName contains to the value Inigo and lastName refers tothe value Montoya.

    A D V A N C E D T O P I C

    System.Console.Read()

    In addition to the System.Console.ReadLine() method, there is also a

    System.Console.Read() method. However, the data type returned by the

    System.Console.Read() method is an integer corresponding to the charac-

    ter value read, or 1 if no more characters are available. To retrieve the

    actual character, it is necessary to first cast the integer to a character, as

    shown in Listing 1.14.

    OUTPUT 1.4:

    >HeyYou.exeHey you!

    Enter your first name: Inigo

    Enter your last name: Montoya

  • 8/3/2019 Essential.csharp.4.0

    66/975

    Chapter 1: Introducing C#

    Listing 1.14: UsingSystem.Console.Read()

    int readValue;

    char character;

    readValue = System.Console.Read();character = (char) readValue;

    System.Console.Write(character);

    The System.Console.Read() method does not return the input until the

    user presses the Enter key; no processing of characters will begin, even if

    the user types multiple characters before pressing the Enter key.

    In C# 2.0, the CLR designers added a new method called System.Console.ReadKey() which, in contrast to System.Console.Read(), returns

    the input after a single keystroke. It allows the developer to intercept the

    keystroke and perform actions such as key validation, restricting the char-

    acters to numerics.

    Writing Output to the Console

    In Listing 1.13, you prompt the user for his first and last names using the

    method System.Console.Write() rather than System.Console.Write-

    Line(). Instead of placing a newline character after displaying the text, the

    System.Console.Write() method leaves the current position on the same

    line. In this way, any text the user enters will be on the same line as the

    prompt for input. The output from Listing 1.13 demonstrates the effect of

    System.Console.Write().

    The next step is to write the values retrieved using System.Console.

    ReadLine() back to the console. In the case of Listing 1.15, the program

    writes out the users full name. However, instead of using System.Con-

    sole.WriteLine() as before, this code will use a slight variation. Output

    1.5 shows the corresponding output.

    Listing 1.15: Formatting UsingSystem.Console.WriteLine()

    class HeyYou{

    static void Main()

    {

    string firstName;

    string lastName;

  • 8/3/2019 Essential.csharp.4.0

    67/975

    Console Input and Output 19

    System.Console.WriteLine("Hey you!");

    System.Console.Write("Enter your first name: ");

    firstName = System.Console.ReadLine();

    System.Console.Write("Enter your last name: ");

    lastName = System.Console.ReadLine();

    }

    }

    Instead of writing out Your full name is followed by another Write

    statement for firstName, a third Write statement for the space, and finally

    a WriteLine statement for lastName, Listing 1.15 writes out the entire out-

    put using composite formatting. With composite formatting, the code first

    supplies a format string to define the output format. In this example, the

    format string is "Your full name is {0} {1}.". It identifies two indexed

    placeholders for data insertion in the string.

    Note that the index value begins at zero. Each inserted parameter

    (known as a format item) appears after the format string in the order corre-

    sponding to the index value. In this example, since firstName is the first

    parameter to follow immediately after the format string, it corresponds to

    index value 0. Similarly, lastName corresponds to index value 1.

    Note that the placeholders within the format string need not appear in

    order. For example, Listing 1.16 switches the order of the indexed place-

    holders and adds a comma, which changes the way the name is displayed

    (see Output 1.6).

    Listing 1.16: Swapping the Indexed Placeholders and Corresponding Variables

    firstName, lastName);

    System.Console.WriteLine("Your full name is {0} {1}.", firstName, lastName);

    OUTPUT 1.5:

    Hey you!

    Enter your first name: Inigo

    Enter your last name: Montoya

    Your full name is Inigo Montoya.

    System.Console.WriteLine("Your full name is {1}, {0}",

  • 8/3/2019 Essential.csharp.4.0

    68/975

    Chapter 1: Introducing C#

    In addition to not having the placeholders appear consecutively within

    the format string, it is possible to use the same placeholder multiple times

    within a format string. Furthermore, it is possible to omit a placeholder. It

    is not possible, however, to have placeholders that do not have a corre-

    sponding parameter.

    Comments

    In this section, you will modify the program in Listing 1.15 by adding com-

    ments. In no way does this vary the execution of the program; rather, pro-

    viding comments within the code makes it more understandable. Listing

    1.17 shows the new code, and Output 1.7 shows the corresponding output.

    Listing 1.17: Commenting Your Code

    OUTPUT 1.6:

    Hey you!

    Enter your first name: Inigo

    Enter your last name: Montoya

    Your full name is Montoya, Inigo

    class CommentSamples

    {

    static void Main()

    {

    string firstName;// Variable for storing the first name

    string lastName; // Variable for storing the last name

    single-line comment

    System.Console.WriteLine("Hey you!");

    System.Console.Write/* No new line */(

    "Enter your first name: ");

    firstName = System.Console.ReadLine();

    System.Console.Write/* No new line */(

    "Enter your last name: ");

    lastName = System.Console.ReadLine();

    /* Display a greeting to the console

    using composite formatting. */

    delimited comment inside statement

    delimited comment

  • 8/3/2019 Essential.csharp.4.0

    69/975

    Comments 21

    In spite of the inserted comments, compiling and executing the new

    program produces the same output as before.

    Programmers use comments to describe and explain the code they are

    writing, especially where the syntax itself is difficult to understand, or per-

    haps a particular algorithm implementation is surprising. Since comments

    are pertinent only to the programmer reviewing the code, the compiler

    ignores comments and generates an assembly that is devoid of any trace

    that comments were part of the original source code.

    Table 1.2 shows four different C# comment types. The program in List-

    ing 1.17 includes two of these.

    OUTPUT 1.7:

    Hey you!

    Enter your first name: Inigo

    Enter your last name: Montoya

    Your full name is Inigo Montoya.

    TABLE 1.2: C# Comment Types

    Comment Type Description Example

    Delimitedcomments

    A forward slash followed by anasterisk, /*, identifies the beginningof a delimited comment. To end thecomment use an asterisk followed bya forward slash: */. Comments ofthis form may span multiple lines inthe code file or appear embeddedwithin a line of code. The asterisks

    that appear at the beginning of thelines but within the delimiters aresimply for formatting.

    /*comment*/

    Continues

    System.Console.WriteLine("Your full name is {0} {1}.",

    firstName, lastName);

    // This is the end

    // of the program listing

    }

    }

  • 8/3/2019 Essential.csharp.4.0

    70/975

    Chapter 1: Introducing C#

    A more comprehensive discussion of the XML comments appears in

    Chapter 9, where I discuss the various XML tags that are explicitly part of

    the XML standard.

    B E G I N N E R T O P I C

    Extensible Markup Language (XML)

    The Extensible Markup Language (XML) is a simple and flexible text for-

    mat frequently used within web applications and for exchanging data

    between applications. XML is extensible because included within an XML

    Comment Type Description Example

    Single-linecomments

    Comments may also be declaredwith a delimiter comprising twoconsecutive forward slash charac-ters: //. The compiler treats all textfrom the delimiter to the end of theline as a comment. Comments of thisform comprise a single line. It is pos-sible, however, to place sequentialsingle-line comments one afteranother, as is the case with the last

    comment in Listing 1.17.

    //comment

    XML delimitedcomments

    Comments that begin with /** andend with **/ are called XML delim-ited comments. They have the samecharacteristics as regular delimitedcomments, except that instead ofignoring XML comments entirely,the compiler can place them into aseparate text file. XML delimited

    comments were only explicitlyadded in C# 2.0, but the syntax iscompatible with C# 1.0.

    /**comment**/

    XML single-linecomments

    XML single-line comments beginwith /// and continue to the end ofthe line. In addition, the compilercan save single-line comments into aseparate file with the XML delimitedcomments.

    ///comment

    TABLE 1.2: C# Comment Types (Continued)

  • 8/3/2019 Essential.csharp.4.0

    71/975

    Managed Execution and the Common Language Infrastructure 23

    document is information that describes the data, known as metadata. Here

    is a sample XML file.

    ...

    The file starts with a header indicating the version and character encoding

    of the XML file. After that appears one main book element. Elements

    begin with a word in angle brackets, such as . To end an element,

    place the same word in angle brackets and add a forward slash to prefix

    the word, as in . In addition to elements, XML supports attributes.

    title="Essential C# 4.0" is an example of an XML attribute. Note that

    the metadata (book title, chapter, and so on) describing the data (EssentialC# 4.0, Operators and Control Flow) is included in the XML file. This

    can result in rather bloated files, but it offers the advantage that the data

    includes a description to aid in interpreting the data.

    Managed Execution and the Common LanguageInfrastructure

    The processor cannot directly interpret an assembly. Assemblies consist

    mainly of a second language known as the Common Intermediate Lan-

    guage (CIL), or IL for short.

    NOTE

    A third term for CIL is Microsoft IL (MSIL). This book uses the termCIL because it is the term adopted by the CLI standard. IL is prevalentin conversation among people writing C# code because they assumethat IL refers to CIL rather than other types of intermediate languages.

  • 8/3/2019 Essential.csharp.4.0

    72/975

    Chapter 1: Introducing C#

    The C# compiler transforms the C# source file into this intermediate

    language. An additional step, usually performed at execution time, is

    required to change the CIL code into machine code that the processor can

    understand. This involves an important element in the execution of a C#

    program: the Virtual Execution System (VES). The VES, also casually

    referred to as the runtime, compiles CIL code as needed (this process is

    known as just-in-time compilation or jitting). The code that executes

    under the context of an agent such as the runtime is managed code, and

    the process of executing under control of the runtime is managed execu-

    tion. It is called managed code because the runtime controls significant

    portions of the programs behavior by managing aspects such as memory

    allocation, security, and just-in-time compilation. Code that does not

    require the runtime in order to execute is unmanaged code.

    The specification for a VES is included in a broader specification known

    as the Common Language Infrastructure (CLI) specification.8 An interna-

    tional standard, the CLI includes specifications for

    The VES or runtime

    The CIL

    A type system that supports language interoperability, known as the

    Common Type System (CTS)

    Guidance on how to write libraries that are accessible from CLI-com-

    patible languages (available in the Common Language Specification

    [CLS])

    NOTE

    The term runtime can refer to either execution time or the Virtual Exe-

    cution System. To help clarify, this book uses the term execution time toindicate when the program is executing, and it uses the term runtimewhen discussing the agent responsible for managing the execution ofa C# program while it executes.

    8. Miller, J., and S. Ragsdale. 2004. The Common Language Infrastructure Annotated Standard.Boston: Addison-Wesley.

  • 8/3/2019 Essential.csharp.4.0

    73/975

  • 8/3/2019 Essential.csharp.4.0

    74/975

    Chapter 1: Introducing C#

    C# and .NET Versioning

    Readers will notice that Output 1.1 refers to the .NET Framework version

    4.0. At the time of this writing, Microsoft had five major releases to the.NET Framework and only four major C# compiler releases. .NET Frame-

    work version 3.0 was an additional set of API libraries released in between

    C# compiler releases (and Visual Studio 2005 and 2008 versions). As a

    result, the .NET Framework version that corresponded with C# 3.0 was

    3.5. With the release of C# 4.0 and the .NET Framework 4.0, the version

    numbers are synchronized. Table 1.3 is a brief overview of the C# and

    .NET releases.

    The majority of all code within this text will work with platforms other

    than Microsofts as long as the compiler version corresponds to the version

    of code required. Although I would very much have liked to provide full

    TABLE 1.3: C# and .NET Versions

    Comment Type Description

    C# 1.0 with .NETFramework 1.0/1.1(Visual Studio 2002and 2003)

    The initial release of C#. A language built from theground up to support .NET programming.

    C# 2.0 with .NETFramework 2.0(Visual Studio 2005)

    Generics were added to the C# language and the .NETFramework 2.0 included libraries that supportedgenerics.

    .NET Framework 3.0 An additional set of APIs for distributed communica-tions (Windows Communication FoundationWCF),rich client presentation (Windows Presentation Foun-dation), workflow (Windows WorkflowWF), andweb authentication (Cardspaces).

    C# 3.0 with .NETFramework 3.5(Visual Studio 2008)

    Added support for LINQ, a significant improvementto the APIs used for programming collections. The.NET Framework 3.5 provided libraries that extendedexisting APIs to make LINQ possible.

    C# 4.0 with .NETFramework 3.5(Visual Studio 2010)

    Added support for dynamic typing along with signifi-cant improvements in the API for writing multi-threaded programs that capitalized on multipleprocessors and cores within those processors.

  • 8/3/2019 Essential.csharp.4.0

    75/975

  • 8/3/2019 Essential.csharp.4.0

    76/975

    Chapter 1: Introducing C#

    developers, this may raise a concern because it is easier for programs to be

    decompiled and algorithms understood without explicitly redistributing

    the source code.

    As with any program, CLI-based or not, the only foolproof way of pre-

    venting disassembly is to disallow access to the compiled program alto-

    gether (for example, only hosting a program on a web site instead of

    distributing it out to a users machine). However, if decreased accessibility

    to the source code is all that is required, there are several obfuscators.

    These obfuscators open up the IL code and munge the code so that it does

    the same thing but in a way that is much more difficult to understand. This

    prevents the casual developer from accessing the code and instead creates

    assemblies that are much more difficult and tedious to decompile into

    comprehensible code. Unless a program requires a high degree of algo-

    rithm security, these obfuscators are generally sufficient.

    A D V A N C E D T O P I C

    CIL Output forHelloWorld.exe

    Listing 1.18 shows the CIL code created by ILDASM.

    Listing 1.18: Sample CIL Output

    // Microsoft (R) .NET Framework IL Disassembler.

    Version 4.0. 21006.1

    // Copyright (c) Microsoft Corporation. All rights reserved.

    // Metadata version: v4.0. 21006

    .assembly extern mscorlib

    {

    .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )

    // .z\V.4..

    .ver 4:0:0:0

    }

    .assembly HelloWorld

    {

    .custom instance void[mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.

    ctor(int32) = ( 01 00 08 00 00 00 00 00 )

    .custom instance void

    [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.

    ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78

    // ....T..WrapNonEx

  • 8/3/2019 Essential.csharp.4.0

    77/975

  • 8/3/2019 Essential.csharp.4.0

    78/975

    Chapter 1: Introducing C#

    The beginning of the listing is the manifest information. It includes not

    only the full name of the disassembled module (HelloWorld.exe), but also

    all the modules and assemblies it depends on, along with their version

    information.

    Perhaps the most interesting thing that you can glean from such a list-

    ing is how relatively easy it is to follow what the program is doing com-

    pared to trying to read and understand machine code (assembler). In the

    listing, an explicit reference to System.Console.WriteLine() appears.

    There is a lot of peripheral information to the CIL code listing, but if a

    developer wanted to understand the inner workings of a C# module (or

    any CLI-based program) without having access to the original source code,

    it would be relatively easy unless an obfuscator is used. In fact, several free

    tools are available (such as Lutz Roeder/Red Gates Reflector for .NET)

    that can decompile from CIL to C# automatically.

    SUMMARY

    This chapter served as a rudimentary introduction to C#. It provided a

    means of familiarizing you with basic C# syntax. Because of C#s similarity

    to C++ style languages, much of what I presented here might not have

    been new material. However, C# and managed code do have some distinct

    characteristics, such as compilation down to CIL. Although it is not

    unique, another key characteristic is that C# includes full support for

    object-oriented programming. Even things such as reading and writing

    data to the console are object-oriented. Object orientation is foundational

    to C#, and you will see this throughout this book.

    The next chapter examines the fundamental data types that are part of

    the C# language, and discusses how you can use these data types with

    operands to form expressions.

  • 8/3/2019 Essential.csharp.4.0

    79/975

    31

    2Data Types

    ROM CHAPTER 1S HelloWorld program, you got a feel for the C# lan-

    guage, its structure, basic syntax characteristics, and how to write the

    simplest of programs. This chapter continues to discuss the C# basics by

    investigating the fundamental C# types.

    Until now, you have worked with only a few primitive data types, with

    little explanation. In C#, thousands of types exist, and you can combine

    types to create new types. A few types in C#, however, are relatively sim-

    ple and are considered the building blocks of all other types. These types

    are predefined types or primitives. The C# languages primitive types

    include eight integer types, two binary floating-point types for scientific

    calculations and one decimal float for financial calculations, one Boolean

    F

    2

    34

    5

    61

    Data Types

    Numeric TypesInteger Types

    Floating-Point Types

    Decimal Type

    Literal Values

    More Types Boolean Type

    Character Type

    Strings

    null and voidCategories of TypesValue TypesReference Types

    ConversionsExplicit CastImplicit Cast

    Without Casting

    Arrays

    Declaring

    Instantiating

    Assigning

    Using

    Strings as Arrays

  • 8/3/2019 Essential.csharp.4.0

    80/975

  • 8/3/2019 Essential.csharp.4.0

    81/975

    Fundamental Numeric Types 33

    nature of primitive types, C# also supplies keywords as short names or

    abbreviations to the full names of fundamental types. From the compilers

    perspective, both names are exactly the same, producing exactly the same

    code. In fact, an examination of the resultant CIL code would provide no

    indication of which name was used.

    Floating-Point Types (float, double)

    Floating-point numbers have varying degrees of precision. If you were to

    read the value of a floating-point number to be 0.1, it could very easily be

    0.099999999999999999 or 0.1000000000000000001 or some other number

    very close to 0.1. Alternatively, a large number such as Avogadros num-ber, 6.02E23, could be off by 9.9E9, which is something also exceptionally

    close to 6.02E23, considering its size. The accuracy of a floating-point num-

    ber is in proportion to the magnitude of the number it represents. Accu-

    racy, therefore, is determined by the number of significant digits, not by a

    fixed value such as 0.01. In other words, absolute precision is a function

    of magnitude and significant digits; the number of significant digits tells

    you about the relative precision.C# supports the two floating-point number types listed in Table 2.2.

    Binary numbers appear as base 10 (denary) numbers for human read-

    ability. The number of bits (binary digits) converts to 15 decimal digits,

    Language Contrast: C++short Data Type

    In C/C++, the short data type is an abbreviation for short int. In C#,

    short on its own is the actual data type.

    TABLE 2.2: Floating-Point Types

    Type Size Range (Inclusive) BCL Name Significant Digits

    float 32 bits 1.5 1045 to3.4 1038

    System.Single 7

    double 64 bits 5.0 10324 to1.7 10308

    System.Double 1516

  • 8/3/2019 Essential.csharp.4.0

    82/975

    Chapter 2: Data Types

    with a remainder that contributes to a sixteenth decimal digit as expressed

    in Table 2.2. Specifically, numbers between 1.7 * 10307 and less than 1 * 10308

    have only 15 significant digits. However, numbers ranging from 1 * 10308 to

    1.7 * 10308 will have 16 significant digits. A similar range of significant dig-

    its occurs with the decimal type as well.

    Decimal Type

    C# contains a numeric type with 128-bit precision (see Table 2.3). This is

    suitable for large and precise calculations, frequently financial calculations.

    Unlike floating-point numbers, thedecimal

    type maintains exact accu-racy for all denary numbers within its range. With the decimal type, there-

    fore, a value of 0.1 is exactly 0.1. However, while the decimal type has

    greater precision than the floating-point types, it has a smaller range. Thus,

    conversions from floating-point types to the decimal type may result in

    overflow errors. Also, calculations with decimal are slightly slower.

    A D V A N C E D T O P I C

    Floating-Point Types and Decimals Dissected

    Unless they are out of range, decimal numbers represent denary numbers

    exactly. In contrast, the floating-point representation of many denary

    numbers introduces a rounding error. This is analogous to how 1/3 is not

    exact in any finite number of decimal digits and 11/10 is not precise in any

    finite number of binary digits. In both cases, we end up with a roundingerror of some kind. The difference between the decimal type and the C#

    floating-point types is that the base of a decimal type is a denary and the

    base of floating-point types is binary.

    TABLE 2.3: decimal Type

    Type Size Range (Inclusive) BCL Name Significant Digits

    decimal 128 bits 1.0 1028 toapproximately7.9 1028

    System.Decimal 2829

  • 8/3/2019 Essential.csharp.4.0

    83/975

  • 8/3/2019 Essential.csharp.4.0

    84/975

    Chapter 2: Data Types

    By default, when you specify a literal number with a decimal