FIFTH EDITION Programming C# 3.0 Jesse Liberty and Donald Xie Beijing • Cambridge • Farnham • Köln • Paris • Sebastopol • Taipei • Tokyo Programming C# 3.0, Fifth Edition by Jesse Liberty and Donald Xie Copyright © 2008 O’Reilly Media, Inc. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (safari.oreilly.com). For more information, contact our corporate/institutional sales department: (800) 998-9938 [email protected]. Editor: John Osborn Indexer: Angela Howard Developmental Editor: Brian MacDonald Cover Designer: Karen Montgomery Production Editor: Sumita Mukherji Interior Designer: David Futato Copyeditor: Audrey Doyle Illustrator: Jessamyn Read Proofreader: Sumita Mukherji Printing History: July 2001: First Edition. February 2002: Second Edition. May 2003: Third Edition. February 2005: Fourth Edition. December 2007: Fifth Edition. Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc.Programming C# 3.0, the image of an African crowned crane, and related trade dress are trademarks of O’Reilly Media, Inc. Java™ is a trademark of Sun Microsystems, Inc. Microsoft, MSDN, the .NET logo, Visual Basic, Visual C++, Visual Studio, and Windows are registered trademarks of Microsoft Corporation. Manyofthedesignationsusedbymanufacturersandsellerstodistinguishtheirproductsareclaimedas trademarks. Where those designations appear in this book, and O’Reilly Media, Inc. was aware of a trademark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and authors assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. This book uses RepKover™, a durable and flexible lay-flat binding. ISBN-10: 0-596-52743-8 ISBN-13: 978-0-596-52743-3 [M] Table of Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix Part I. The C# Language 1. C# 3.0 and .NET 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 The Evolution of C# 3 The C# Language 4 The .NET Platform 6 2. Getting Started: “Hello World” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Classes, Objects, and Types 7 Developing “Hello World” 14 Using the Visual Studio 2008 Debugger 18 3. C# Language Fundamentals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Types 21 Variables and Constants 25 Whitespace 33 Statements 33 Operators 49 Preprocessor Directives 59 4. Classes and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Defining Classes 62 Creating Objects 67 Using Static Members 75 Destroying Objects 79 Passing Parameters 83 iii Overloading Methods and Constructors 89 Encapsulating Data with Properties 92 readonly Fields 96 5. Inheritance and Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Specialization and Generalization 98 Inheritance 101 Polymorphism 102 Abstract Classes 109 The Root of All Types: Object 113 Nesting Classes 115 6. Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Using the operator Keyword 118 Supporting Other .NET Languages 119 Creating Useful Operators 120 Logical Pairs 120 The Equality Operator 120 Conversion Operators 121 Putting Operators to Work 121 7. Structs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 Defining Structs 128 Creating Structs 129 8. Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Defining and Implementing an Interface 132 Overriding Interface Implementations 147 Explicit Interface Implementation 151 9. Arrays, Indexers, and Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Arrays 156 The foreach Statement 162 Indexers 177 Collection Interfaces 186 Constraints 190 List<T> 195 Queues 206 Stacks 208 Dictionaries 211 iv | Table of Contents 10. Strings and Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Strings 215 Regular Expressions 229 11. Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Throwing and Catching Exceptions 242 Exception Objects 252 12. Delegates and Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Events 256 Events and Delegates 257 Anonymous Methods 271 Part II. C# and Data 13. Introducing LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Defining and Executing a Query 280 LINQ and C# 285 Anonymous Types 291 Implicitly Typed Local Variables 291 Extension Methods 292 Lambda Expressions in LINQ 297 14. Working with XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 XML Basics (A Quick Review) 302 X Stands for eXtensible 304 Creating XML Documents 304 Searching in XML with XPath 311 Searching Using XPathNavigator 322 XML Serialization 329 15. Putting LINQ to Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Getting Set Up 338 LINQ to SQL Fundamentals 339 Using Visual Studio LINQ to SQL Designer 344 Retrieving Data 349 Updating Data Using LINQ to SQL 353 Deleting Relational Data 358 LINQ to XML 363 Table of Contents | v 16. ADO.NET and Relational Databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 Relational Databases and SQL 368 The ADO.NET Object Model 372 Getting Started with ADO.NET 374 Part III. Programming with C# 17. Programming ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Web Forms Fundamentals 381 Creating a Web Form 385 Data Binding 391 18. Programming WPF Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 WPF in a Very Small Nutshell 404 Building the Application 406 What Have You Learned, Dorothy? 419 19. Programming Windows Forms Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Creating the Application 420 Part IV. The CLR and the .NET Framework 20. Attributes and Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 Attributes 449 Reflection 456 21. Threads and Synchronization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Threads 466 Synchronization 474 Race Conditions and Deadlocks 485 22. Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Files and Directories 488 Reading and Writing Data 499 Asynchronous I/O 506 Network I/O 511 Web Streams 527 Serialization 529 Isolated Storage 538 vi | Table of Contents 23. Programming .NET and COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 Importing ActiveX Controls 542 P/Invoke 551 Pointers 554 C# Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 Table of Contents | vii Preface 1 In 2000, .NET revolutionized the way we create both web and Windows applica- tions. .NET 2.0 was a dramatic incremental improvement over .NET 1.0. This book coversC#3.0and.NET3.5,andthistimewearelookingatanevenmoresignificant set of changes. C# 3.0 introduces a new generation of changes to a framework that takes an enor- mousleapforward,revolutionizingthewayweprogramWindowsapplications,web services, and, to a lesser degree, web applications. In 2000, I wrote in the first edition of this book that Microsoft had “bet the com- pany” on .NET. It was a good bet. In 2007, I bet my career on .NET by joining Microsoft as senior program manager in the Silverlight Development Division. Because one way (my preferred way) to program Silverlight is with C#, I have the opportunity to stay very current with this mature yet rapidly evolving language. It is anexcitingtimeforC#;version3.0addsanumberoftremendouslyusefulfeatures, andthenewesteditionofVisualStudiomakesprogrammingwiththesefeatureseas- ier than ever. It is my goal that you’ll find Programming C# 3.0 to be of great use whether this is your first exposure to .NET programming, or you’ve been at it for some time. I’ll start with the fundamentals, and introduce new additions to the language not as obscure add-ons, but as the integrated features that they are. If you are already a C# 2.0 programmer, feel free to skim through the parts you know.Thenewfeaturesarecalledoutbyappropriateheadings;youwon’tinadvert- ently skip over them. But be sure to reread Chapter12, and all of Parts II and III. ix C# and .NET The programming language of choice for .NET is C#, which builds on the lessons learned from C (high performance), C++ (object-oriented structure), Java™ (gar- bage collection, high security), and Visual Basic (rapid development) to create a languageideallysuitedfordevelopingcomponent-based,n-tier,distributedWindows client and web applications. C# 3.0 brings greatly enhanced features and a powerful new development environ- ment. It is the crowning achievement of Microsoft’s R&D investment. It is wicked cool. About This Book This book is a tutorial, both on C# and on writing .NET applications with C#. IfyouareaproficientC#2.0programmer,andallyouwanttoknowiswhatisnew in C# 3.0, put this book down, buy Programming .NET 3.5 by myself and Alex Horovitz (O’Reilly), and then read a lot about Language-Integrated Query (LINQ). You’ll get by. If,ontheotherhand,youwanttobrushuponyourC#skills,oryouareproficient in another programming language such as C++ or Java, or even if C# is your first programming language, this book is for you. NotethatforthiseditionIhavebeenjoinedbyasecondauthor:DonaldXie.Donald and I have worked together on a number of books for the past decade. He is smart, diligent,andcareful,andmuchoftheworkofthisbookishis,buteverywordinthis book is mine. Donald wrote and rewrote much of the new material, but he did so knowing that I would then rewrite it so that this book speaks with a single voice. I think it is imperative for a tutorial such as this to speak from the mind of a single developer (me) into the mind of another developer (you) with as little distortion as possible. What You Need to Use This Book To make the best use of this book, please obtain the latest release of Visual Studio 2008. Any edition will do, including the Express edition for C#. For Chapter16, you will want to ensure that SQL Server or SQL Server Express is installed (it is normally installed automatically with Visual Studio), and you’ll want to install the (old) Northwind database that was created for SQL Server 2000, but which works fine with the latest SQL Server editions. ToruntheWindowsPresentationFoundation(WPF)exampleinChapter18,you’ll need to be running Vista, or you’ll need to download the .NET 3.5 runtime. x | Preface