saalek110
Well-Known Member
http://rapidshare.com/files/42531926/accelerated-vb-2005.rar.html
2 مگا حدودا.Accelerated VB 2005
کد:
Contents
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
About the Technical Reviewers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
■CHAPTER 1 VB 2005 Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Differences Between VB 2005, C#, and VB6. . . . . . . . . . . . . . . . . . . . . . . . . . 1
.NET Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
VB 2005 and C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
VB 2005 and VB6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
CLR Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Common Type System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
A Simple VB 2005 Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
What’s New in VB 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
New Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
My Namespace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
■CHAPTER 2 VB 2005 and the CLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
From VB to IL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
From IL to Platform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Understanding Assemblies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Assembly Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Private Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Shared Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Loading Assemblies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Cross-Language Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Metadata: Better Than COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
vii
■CHAPTER 3 VB Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Types and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Strong Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Type Categories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Value Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Reference Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Type Conversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Defining Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Using Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Control Flow Constructs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
If...Then...Else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Select...Case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Iteration and Looping Constructs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
For Each…Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
For...Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Do While and Do Until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
■CHAPTER 4 Classes and Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Class Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Accessibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
MyBase and MyClass Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
NotInheritable Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
MustInherit Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Nested Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Item Property Indexers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Partial Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Value Type Definitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
The Meaning of Me . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Finalizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Boxing and Unboxing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
When Boxing Occurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Efficiency and Confusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
viii ■CONTENTS
System.Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Equality and What It Means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
The IComparable Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Creating Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
The New Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Shared Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Instance Constructor and Creation Ordering. . . . . . . . . . . . . . . . . . . . 78
Destroying Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Finalizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Disposable Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The IDisposable Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Using Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
■CHAPTER 5 Methods, Properties, and Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Shared Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Instance Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Method Parameter Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Method Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Overridable and MustOverride Methods . . . . . . . . . . . . . . . . . . . . . . . 90
A Final Few Words on Overridable Methods . . . . . . . . . . . . . . . . . . . . 93
Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Accessors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Declaring Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Field Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
■CHAPTER 6 Inheritance, Polymorphism, and Encapsulation . . . . . . . . . 101
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Accessibility of Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Implicit Conversion and a Taste of Polymorphism . . . . . . . . . . . . . . 102
Member Hiding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Inheritance, Containment, and Delegation . . . . . . . . . . . . . . . . . . . . . . . . . 107
Choosing Between Interface and Class Inheritance. . . . . . . . . . . . . 107
Delegation and Composition vs. Inheritance . . . . . . . . . . . . . . . . . . . 109
Encapsulation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
■CONTENTS ix
■CHAPTER 7 Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Interfaces Are Reference Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Defining Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
What Can Be in an Interface? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Interface Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Implementing Multiple Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Hiding Interface Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Implementing Interfaces in Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Beware of Side Effects of Value Types Implementing Interfaces . . 125
Using Generics with Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Using a Generic Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Using a Generic Method in an Interface. . . . . . . . . . . . . . . . . . . . . . . 126
Contracts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Implementing Contracts with Classes . . . . . . . . . . . . . . . . . . . . . . . . 127
Implementing Contracts with Interfaces . . . . . . . . . . . . . . . . . . . . . . 129
Choosing Between Interfaces and Classes . . . . . . . . . . . . . . . . . . . . . . . . . 130
Polymorphism with Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
■CHAPTER 8 Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Just Because You Can Doesn’t Mean You Should . . . . . . . . . . . . . . . . . . . 137
Operators That Can Be Overloaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Types and Formats of Overloaded Operators . . . . . . . . . . . . . . . . . . . . . . . 138
Operators Shouldn’t Mutate Their Operands . . . . . . . . . . . . . . . . . . . . . . . 139
Does Parameter Order Matter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Overloading the Addition Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Conversion Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Boolean Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
■CHAPTER 9 Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Handling Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Avoid Using Exceptions to Control Flow. . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Mechanics of Handling Exceptions in VB 2005 . . . . . . . . . . . . . . . . . . . . . 154
Throwing Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Unhandled Exceptions in .NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Syntax Overview of the Try Statement . . . . . . . . . . . . . . . . . . . . . . . . 155
Rethrowing Exceptions and Translating Exceptions. . . . . . . . . . . . . 157
x ■CONTENTS
Exceptions Thrown in Finally Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . 159
Exceptions Thrown in Finalizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Exceptions Thrown in Static Constructors. . . . . . . . . . . . . . . . . . . . . 161
Achieving Exception Neutrality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Basic Structure of Exception-Neutral Code . . . . . . . . . . . . . . . . . . . . 163
Constrained Execution Regions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Critical Finalizers and SafeHandle. . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Creating Custom Exception Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Working with Allocated Resources and Exceptions . . . . . . . . . . . . . . . . . . 177
Providing Rollback Behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
■CHAPTER 10 Working with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
String Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
String Literals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Format Specifiers and Globalization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Object.ToString(), IFormattable, and CultureInfo. . . . . . . . . . . . . . . . 187
Creating and Registering Custom CultureInfo Types . . . . . . . . . . . . 189
Format Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Console.WriteLine() and String.Format() . . . . . . . . . . . . . . . . . . . . . . 192
Examples of String Formatting in Custom Types . . . . . . . . . . . . . . . 193
ICustomFormatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Comparing Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Working with Strings from Outside Sources . . . . . . . . . . . . . . . . . . . . . . . . 199
StringBuilder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Searching Strings with Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . 203
Searching with Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . 203
Searching and Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Replacing Text with Regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Regex Creation Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
■CHAPTER 11 Arrays and Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Introduction to Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Type Convertibility and Covariance. . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Sortability and Searchability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Multidimensional Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Multidimensional Jagged Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
■CONTENTS xi
Collection Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Comparing ICollection(Of T) with ICollection . . . . . . . . . . . . . . . . . . . 222
Collection Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Types That Produce Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
System.Collections.ObjectModel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
How Iteration Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
■CHAPTER 12 Delegates and Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Overview of Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Delegate Creation and Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Single Delegate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Delegate Chaining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Iterating Through Delegate Chains . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Open-Instance Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Strategy Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Custom Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
■CHAPTER 13 Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Introduction to Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Efficiency and Type Safety of Generics . . . . . . . . . . . . . . . . . . . . . . . 254
Generic Type Placeholder Naming Conventions . . . . . . . . . . . . . . . . 256
Generic Type Definitions and Constructed Types . . . . . . . . . . . . . . . . . . . . 256
Generic Classes and Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Generic Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Generic Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Generic Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Generic Type Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Nullable Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Constructed Types Control Accessibility. . . . . . . . . . . . . . . . . . . . . . . 267
Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Constraints on Nonclass Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Generic System Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
xii ■CONTENTS
Select Problems and Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Conversion and Operators Within Generic Types . . . . . . . . . . . . . . . 274
Creating Constructed Types Dynamically . . . . . . . . . . . . . . . . . . . . . 285
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
■CHAPTER 14 Threading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Threading in VB 2005 and .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Starting Threads. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
The IOU Pattern and Asynchronous Method Calls . . . . . . . . . . . . . . 292
States of a Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Terminating Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Halting and Waking Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Waiting for a Thread to Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Foreground and Background Threads . . . . . . . . . . . . . . . . . . . . . . . . 299
Thread-Local Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Synchronizing Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Lightweight Synchronization with the Interlocked Class. . . . . . . . . 304
Monitor Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Locking Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Win32 Synchronization Objects and WaitHandle . . . . . . . . . . . . . . . 324
Using the ThreadPool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Asynchronous Method Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
■CHAPTER 15 Canonical Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Reference-Type Canonical Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Default to NotInheritable Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Use the NVI Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Is the Object Cloneable?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Is the Object Disposable? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Does the Object Need a Finalizer? . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
What Does Equality Mean for This Object? . . . . . . . . . . . . . . . . . . . . 355
If You Override Equals(), Override GetHashCode(). . . . . . . . . . . . . . . 362
Does the Object Support Ordering? . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Is the Object Formattable? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
■CONTENTS xiii
Is the Object Convertible? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Prefer Type Safety at All Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Using Immutable Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Value-Type Canonical Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Override Equals() for Better Performance . . . . . . . . . . . . . . . . . . . . . 382
Do Values of This Type Support Any Interfaces?. . . . . . . . . . . . . . . . 387
Implement Type-Safe Forms of Interface Members and Derived
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Design Checklists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Checklist for Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Checklist for Value Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
■APPENDIX A Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Books. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Articles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
■APPENDIX B Running the Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Example Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Classes, Structures, and Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Console Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
A Few Words Regarding Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399