Illustrated C# 2008 ■ ■ ■ Daniel Solis Illustrated C# 2008 Copyright © 2008 by Daniel Solis All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-954-9 ISBN-10 (pbk): 1-59059-954-3 ISBN-13 (electronic): 978-1-4302-0574-6 ISBN-10 (electronic): 1-4302-0574-1 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Matthew Moodie Technical Reviewer: Christophe Nasarre Editorial Board: Clay Andres, Steve Anglin, Ewan Buckingham, Tony Campbell, Gary Cornell, JonathanGennick, Kevin Goff, Matthew Moodie, Joseph Ottinger, Jeffrey Pepper, Frank Pohlmann, Ben Renow-Clarke, Dominic Shakeshaft, Matt Wade, Tom Welsh Project Manager: Kylie Johnston Copy Editor: Damon Larson Associate Production Director: Kari Brooks-Copony Production Editor: Ellie Fountain Compositor: Pat Christenson Proofreader: Linda Seifert Indexer: John Collin Artist: Daniel Solis Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2855 Telegraph Avenue, Suite 600, Berkeley, CA 94705. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http:// www.apress.com. Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Special Bulk Sales–eBook Licensing web page at http://www.apress.com/info/bulksales. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com. I would like to dedicate this book to my parents—Sal and Amy, and to Sian, and to Sue. Contents at a Glance About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxv Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxvii Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix ■CHAPTER 1 C# and the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ■CHAPTER 2 Overview of C# Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 ■CHAPTER 3 Types, Storage, and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 ■CHAPTER 4 Classes: The Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 ■CHAPTER 5 Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 ■CHAPTER 6 More About Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 ■CHAPTER 7 Classes and Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 ■CHAPTER 8 Expressions and Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 ■CHAPTER 9 Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 ■CHAPTER 10 Namespaces and Assemblies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 ■CHAPTER 11 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 ■CHAPTER 12 Structs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 ■CHAPTER 13 Enumerations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 ■CHAPTER 14 Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 ■CHAPTER 15 Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 ■CHAPTER 16 Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 ■CHAPTER 17 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 ■CHAPTER 18 Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 ■CHAPTER 19 Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 ■CHAPTER 20 Enumerators and Iterators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 ■CHAPTER 21 Introduction to LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 ■CHAPTER 22 Introduction to Asynchronous Programming . . . . . . . . . . . . . . . . . . 573 ■CHAPTER 23 Preprocessor Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 iv ■CHAPTER 24 Reflection and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 ■CHAPTER 25 Other Topics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 ■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657 v Contents About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii About the Technical Reviewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxv Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix ■CHAPTER 1 C# and the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Before .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Windows Programming in the Late 1990s . . . . . . . . . . . . . . . . . . . . . . 2 Goals for the Next-Generation Platform . . . . . . . . . . . . . . . . . . . . . . . . 2 Enter Microsoft .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Components of the .NET Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . 3 An Improved Programming Environment . . . . . . . . . . . . . . . . . . . . . . . 4 Compiling to the Common Intermediate Language(CIL). . . . . . . . . . . . . . . 7 Compiling to Native Code and Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Overview of Compilation and Execution . . . . . . . . . . . . . . . . . . . . . . . . 9 The Common Language Runtime (CLR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 The Common Language Infrastructure (CLI) . . . . . . . . . . . . . . . . . . . . . . . . 11 Important Parts of the CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Review of the Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ■CHAPTER 2 Overview of C# Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 A Simple C# Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 More About SimpleProgram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Identifiers and Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Keywords. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Main: The Starting Point of a Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Simple Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Text Output from a Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 vii viii ■CONTENTS WriteLine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 The Format String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Multiple Markers and Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Comments: Annotating the Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 More About Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Documentation Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Summary of Comment Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 ■CHAPTER 3 Types, Storage, and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 A C# Program Is a Set of Type Declarations . . . . . . . . . . . . . . . . . . . . . . . . 32 A Type Is a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Instantiating a Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Data Members and Function Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Types of Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Predefined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 More About the Predefined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 User-Defined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 The Stack and the Heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 The Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 The Heap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Value Types and Reference Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Storing Members of a Reference Type Object. . . . . . . . . . . . . . . . . . 40 Categorizing the C# Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Variable Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Multiple-Variable Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Using the Value of a Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 ■CHAPTER 4 Classes: The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Overview of Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 A Class Is an Active Data Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Programs and Classes: A Quick Example. . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Declaring a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Class Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 ■CONTENTS ix Creating Variables and Instances of a Class . . . . . . . . . . . . . . . . . . . . . . . . 52 Allocating Memory for the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Combining the Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Instance Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Access Modifiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Private and Public Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Accessing Members from Inside the Class . . . . . . . . . . . . . . . . . . . . . . . . . 59 Accessing Members from Outside the Class. . . . . . . . . . . . . . . . . . . . . . . . 60 Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ■CHAPTER 5 Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 The Structure of a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Code Execution in the Method Body . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Type Inference and the var Keyword. . . . . . . . . . . . . . . . . . . . . . . . . . 69 Local Variables Inside Nested Blocks . . . . . . . . . . . . . . . . . . . . . . . . . 70 Local Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Flow of Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Method Invocations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Return Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 The Return Statement and Void Methods. . . . . . . . . . . . . . . . . . . . . . 76 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Formal Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Actual Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Value Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Reference Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Output Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Parameter Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Method Invocation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Arrays As Actual Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Summary of Parameter Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Stack Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Recursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Method Overloading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 x ■CONTENTS ■CHAPTER 6 More About Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Class Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Order of Member Modifiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Instance Class Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Static Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Accessing Static Members from Outside the Class . . . . . . . . . . . . . . . . . 106 Example of a Static Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Lifetimes of Static Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Static Function Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Other Static Class Member Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Member Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Constants Are Like Statics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Property Declarations and Accessors . . . . . . . . . . . . . . . . . . . . . . . . 114 A Property Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Using a Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Properties and Associated Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Performing Other Calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Read-Only and Write-Only Properties . . . . . . . . . . . . . . . . . . . . . . . . 120 An Example of a Computed, Read-Only Property . . . . . . . . . . . . . . 121 Example of Properties and Databases. . . . . . . . . . . . . . . . . . . . . . . . 122 Automatically Implemented Properties . . . . . . . . . . . . . . . . . . . . . . . 123 Static Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Instance Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Constructors with Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Default Constructors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Static Constructors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Example of a Static Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Accessibility of Constructors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Object Initializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Calling the Destructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 The Standard Dispose Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Comparing Constructors and Destructors . . . . . . . . . . . . . . . . . . . . . . . . . 137 The readonly Modifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 The this Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140