DOCUMENT:Q323147 11-JUL-2002 [mspress] TITLE :Applied Microsoft .NET Framework Programming Comments and Correc PRODUCT :Microsoft Press PROD/VER:: OPER/SYS: KEYWORDS:kbdocfix kbdocerr ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - MSPRESS Applied Microsoft.NET Framework Programming ISBN 0-7356-1422-9 ------------------------------------------------------------------------------- SUMMARY ======= This article contains comments, corrections, and information about known errors relating to the Microsoft Press book Applied Microsoft .NET Framework Programming, ISBN 0-7356-1422-9. The following topics are covered: - Page 10: MSCorLib.dll Should Be MSCorEE.dll in Diagram 1-3 - Page 11: Standard Edition Should Be Second Edition - Page 19: System.Security.Verifier.Exception Should Be System.Security.Verification.Exception - Page 20: Verifier Should Be Verification - Page 27: CTS And CLR Should Be CLS - Page 28: Missing Text - Page 68: Standard Edition Should Be Second Edition - Page 77: AssemblyAlgIDAttribute Should Be AssemblyAlgorithmidAttribute - Page 78: Incorrect Build Number - Page 81: Bad Breaks In Listing - Page 107: Policy.1.0.MyAsm.dll Should Be Policy.1.0.JeffTypes.dll - Page 110: Standard Should Be Second - Page 119: public void Should Be public static void - Page 121: Incorrect Table Number - Page 121: Correction To Table Items - Page 123: Complier Should Be Compiler - Page 126: System.Collections.StringCollections Should Be System.IO.FileSystemWatcher - Page 126: System.Collections.ArrayList Should Be System.IO.FileStream - Page 126: Correction To Sentence - Page 129: Int64 Should Be Int32 - Page 129: Correction To Sentence - Page 129: BinaryRead Should Be BinaryReader - Page 135: ValueType Should Be System.ValueType - Page 138: Missing "Is" - Page 140: InteropService Should Be Pluralized - Page 141: Array Should Be ArrayList - Page 141: void Should Be Int32 - Page 142: Stack-base Should Be Stack-Based - Page 144: Missing Semicolon - Page 152: p Should Be p2 - Page 155 & 157: Correction To Code Sample - Page 160: Capital "I" Needed - Page 166: Correction To Code Sample - Page 177: MaxInt32 Should Be MaxInt16 - Page 179: Disregard Note Box - Page 180: Correction To Code Sample - Page 180: type's Should Be class's - Page 186: Correction To Error Text - Page 188: Disregard Portion Of Sentence - Page 199: 2.5 Should Be 2.5F - Page 202: Initialize Should Be Initialized - Page 204: Void Should Be Static Void - Page 206: Void Should Be Static Void - Page 218: Missing Word - Page 219: Delete Closing Brace - Page 220: Delete Parenthesis - Page 220: Correction To Code Listing - Page 221: foreach Should Be for - Page 222: Missing Word - Page 223: Changes To Code Listing - Page 230: Final Paragraph Should Be Part Of Note Box - Page 232: Missing "virtual" - Page 232: Missing "virtual" - Page 234: Transposed Text In Code Listing - Page 236: Brace Should Be Parenthesis - Page 273: Correction To Table 12-4 - Page 273: Correction To Table 12-4 - Pages 283-284: Replace Code Listing - Page 284: Doesn't Should Be Does - Page 303: Correction To Code Listing - Page 310: Section Should Be Chapter - Page 328: this Should Be other In Code Listing - Page 337: Error In Code Sample - Page 339: private Should Be protected - Page 340: private Should Be protected - Page 355: Remove "and" - Page 374: Correction To Code Listing - Page 374: Correction To Code Sample - Page 374: Correction To Code Sample - Page 378: "Feedback" Missing - Page 381: Missing Parenthesis In Code Sample - Page 473: "would" Should Be "should" - Page 473: "wouldn't" Should Be "would" - Page 477: "didn't" Should Be "did" - Pages 496 & 497: "J" Should Be "K" - Page 523: Delete "second version" MORE INFORMATION ================ Page 10: MSCorLib.dll Should Be MSCorEE.dll in Diagram 1-3 ---------------------------------------------------------- On page 10, in figure 1-3, an incorrect DLL is referenced. Change the box currently reading: "DLL:MSCorLib.dll Function:_CorExeMain" To: "DLL:MSCorEE.dll Function:_CorExeMain" Page 11: Standard Edition Should Be Second Edition -------------------------------------------------- On page 11, in the first sentence of the third paragraph, Change: "[...] Windows 98 Standard Edition [...]" To: "[...] Windows 98 Second Edition [...]" Page 19: System.Security.Verifier.Exception Should Be System.Security.Verification.Exception -------------------------------------------------------------------------------------------- In the last sentence on page 19, Change: "[...] System.Security.Verifier.Exception [...]" To: "[...] System.Security.Verification.Exception [...]" Page 20: Verifier Should Be Verification ---------------------------------------- On page 20, in the box titled "Is Your Code Safe?", in last sentence of the third paragraph, Change: "[...] VerifierException [...]" To: "[...] VerificationException [...]" Page 27: CTS And CLR Should Be CLS ---------------------------------- On page 27, in the second sentence of the fourth paragraph, there is a reference to "CTS" and a reference to "CLR". Both of these should read "CLS". Page 28: Missing Text --------------------- On page 28, the next to last sentence of the third paragraph is missing some words. Change: "The second error is because this type exposes two public methods that differ only by case: Abc and abc." To: "The second error is because this type exposes two public methods that differ only by case and return type: Abc and abc." Page 68: Standard Edition Should Be Second Edition -------------------------------------------------- On page 68, in the first paragraph, change the reference to "Windows 98 Standard Edition" to "Windows 98 Second Edition". Page 77: AssemblyAlgIDAttribute Should Be AssemblyAlgorithmidAttribute ---------------------------------------------------------------------- At the top of page 77, change "System.Reflection.AssemblyAlgIDAttribute" to "System.Reflection.AssemblyAlgorithmIdAttribute". Note there are two changes--ID becomes Id, and Alg becomes Algorithm. Page 78: Incorrect Build Number ------------------------------- On page 78, in the listing AssemblyRef #1, Change: "Build Number: 0x0000c1e" To: "Build Number: 0x0000ce4" Page 81: Bad Breaks In Listing ------------------------------ On page 81, there are two bad breaks in the listing. Change: /ur Uninstalls an assembly reference. Include the name of the assembly, type of reference, ID and data as parameters. Example: / ur myDLL.Version=1.1.0.0,Culture=en.PublicKeyToken=874e23ab874e23ab FILEPATH c:\apps\myapp.exe MyApp To: /ur Uninstalls an assembly reference. Include the name of the assembly, type of reference, ID and data as parameters. Example: /ur myDLL.Version=1.1.0.0,Culture=en. PublicKeyToken=874e23ab874e23ab FILEPATH c:\apps\myapp.exe MyApp Change: /uf Forces uninstall of an assembly by removing all install references. Include the full name of the assembly to remove as a parameter. Assembly will be removed unless referenced by Windows Installer. Example: / uf myDLL.Version=1.1.0.0,Culture=en.PublicKeyToken=874e23ab874e23ab To: /uf Forces uninstall of an assembly by removing all install references. Include the full name of the assembly to remove as a parameter. Assembly will be removed unless referenced by Windows Installer. Example: /uf myDLL.Version=1.1.0.0,Culture=en. PublicKeyToken=874e23ab874e23ab Page 107: Policy.1.0.MyAsm.dll Should Be Policy.1.0.JeffTypes.dll ----------------------------------------------------------------- On page 107, in the bulleted paragraph "The /out switch", Change: "[...] Policy.1.0.MyAsm.dll [...]" To: "[...] Policy.1.0.JeffTypes.dll [...]" Page 110: Standard Should Be Second ----------------------------------- On page 110, in the Note box, change the reference to "Windows 98 Standard Edition" to "Windows 98 Second Edition". Page 119: public void Should Be public static void -------------------------------------------------- On page 119, in the first line of the listing, Change: public void PromoteEmployee(Object o) { ... To: public static void PromoteEmployee(Object o) { ... Page 121: Incorrect Table Number -------------------------------- On page 121, in the Table "Type-Safety Quiz", change the table number from "4-4" to "4-3". Page 121: Corrections To Table Items ------------------------------------ On page 121, in the table "Type-Safety Quiz", there are three incorrect lines. On line 10, change: "B b3 = d1;" To: "B b4 = d1;" On line 15, change: "B b4 = (B) o1;" To: "B b5 = (B) o1;" On line 16, change: "B b5 = (D) b2;" To: "B b6 = (D) b2;" Page 123: Complier Should Be Compiler ------------------------------------- On page 123, in the second sentence of the second paragraph, change "complier" to "compiler". Page 126: System.Collections.StringCollections Should Be System.IO.FileSystemWatcher ------------------------------------------------------------------------------------ On page 126, in the first paragraph of "How Namespaces and Assemblies Relate" change "System.Collections.StringCollections" to "System.IO.FileSystemWatcher" Page 126: System.Collections.ArrayList Should Be System.IO.FileStream --------------------------------------------------------------------- On page 126, in the first paragraph of "How Namespaces and Assemblies Relate" change "System.Collections.ArrayList" to "System.IO.FileStream" Page 126: Correction To Sentence -------------------------------- On page 126, in the box "How Names and Assemblies Relate", change the final line of the third paragraph from: "[...] source code and you'd use the /r:System.Windows.dll compiler switch." To: "[...] source code and use the /r:System.Windows.dll compiler switch Forms." Page 129: Int64 Should Be Int32 ------------------------------- On page 129, in the second bulleted item, third line, change "Int64" to "Int32". Page 129: Correction To Sentence -------------------------------- On page 129, in the third bulleted item, change the first sentence: "[...] that have type names in the method." To: "[...] that have type names as part of their method names." Page 129: BinaryRead Should Be BinaryReader ------------------------------------------- On page 129, in the listing in the third bulleted item, Change: BinaryReader br = new BinaryRead(...); ... To: BinaryReader br = new BinaryReader(...); ... Page 135: ValueType Should Be System.ValueType ---------------------------------------------- On page 135, in third paragraph, last sentence (above the Note box), change the final word "ValueType" to "System.ValueType". Page 138: Missing "Is" ---------------------- On page 138, in the second sentence, Change: "[...] C# thinks the instance initialized [...]" To: "[...] C# thinks the instance is initialized [...]" Page 140: InteropService Should Be Pluralized --------------------------------------------- On page 140, in the box "How the CLR Controls the Layout of a Type's Fields", in the example at the bottom, Change: using System; using System.Runtime.InteropService; ... To: using System; using System.Runtime.InteropServices; ... Page 141: Array Should Be ArrayList ----------------------------------- On page 141, in the code example, Change: ... a.Add(p); //Box the value type and add the // reference to the Array. ... To: ... a.Add(p); //Box the value type and add the // reference to the ArrayList. ... Page 141: void Should Be Int32 ------------------------------ On page 141, after the second paragraph is a code snip for the Add method, Change: public virtual void Add(Object value); To: public virtual Int32 Add(Object value); Page 144: Missing Semicolon --------------------------- On page 144, in the code example, Change: ... o = p } To: ... o = p; } Page 152: p Should Be p2 ------------------------ On page 152, in the third bulleted item, change the first two references to "p" to "p2". Pages 155 & 157: Correction To Code Sample ------------------------------------------ On pages 155 and 157, approximately middle of each page, Change: // Optional overloads of the == and != operators public static Boolean operator==(MyRefType o1, MyRefType o2) { if (ol == null) return false; return ol.Equals(o2); } To: // Optional overloads of the == and != operators public static Boolean operator==(MyRefType o1, MyRefType o2) { return Object.Equals(o1, o2); } Page 160: Capital "I" Needed ---------------------------- On page 160, under "Summary of Implementing Equals and the ==/!= Operators", in the first bulleted item, references to "Uint16", "Uint32", "Uint64" all need the "i" capitalized so they read: "UInt16", "UInt32", "UInt64" Page 166: Correction To Code Sample ----------------------------------- On page 166, in the first code sample, Change: ... // Refer to a deep copy of the set passed. this.set = set.Clone(); To: ... // Refer to a shallow copy of the set passed. this.set = (ArrayList) set.Clone(); Page 177: MaxInt32 Should Be MaxInt16 ------------------------------------- On page 177, on the last line, change "MaxInt32" to "MaxInt16". Page 179: Disregard Note Box ---------------------------- On page 179, disregard the Note Box at the top of the page. Page 180: Correction To Code Sample ----------------------------------- On page 180, in the code sample, Change: ... // This is an instance read-only field. public String readonly pathName = "untitled"; To: ... // This is an instance read-only field. public readonly String pathName = "untitled"; Page 180: type's Should Be class's ---------------------------------- On page 180, in the final paragraph, Change: "[...] to initialize a type's constants, [...]" To: "[...] to initialize a class's constants, [...]" Page 186: Correction To Error Text ---------------------------------- On page 186, in the second paragraph after the Note box, Change: "[...] produces the following: "error CS0573: 'SomeType.x': [...]" To: "[...] produces the following: "error CS0573: 'SomeValType.x': [...]" Page 188: Disregard Portion Of Sentence --------------------------------------- On page 188, in the third paragraph, disregard: "(or process if the assembly is loaded in a domain neutral fashion)" Page 199: 2.5 Should Be 2.5F ---------------------------- On page 199, in the code example, change: Rational r2 = 2.5; // Implicit cast from Single to Rational To: Rational r2 = 2.5F; // Implicit cast from Single to Rational Page 202: Initialize Should Be Initialized ------------------------------------------ On page 202, in the upper code example, change: v += 10; // This method can use the initialize value in v. To: v += 10; // This method can use the initialized value in v. Page 204: Void Should Be Static Void ------------------------------------ On page 204, in the first code example, there are two lines beginning with the word "void" that need to be changed. Change: void StartProcessingFiles(out FileStream fs) { To: static void StartProcessingFiles(out FileStream fs) { Change: void ContinueProcessingFiles(ref FileStream fs) { To: static void ContinueProcessingFiles(ref FileStream fs) { Page 206: Void Should Be Static Void ------------------------------------ On page 206, in the code sample, change: void GetAnObject(out Object o) { To: static void GetAnObject(out Object o) { Page 218: Missing Word ---------------------- On page 218, the word "method" is missing in the first two bulleted items. In the first bullet, change: "...define a get accessor for the property." To: "...define a get accessor method for the property." In the second bullet, change: "...define a set accessor for the property." To: "...define a set accessor method for the property." Page 219: Delete Closing Brace ------------------------------ The code sample on page 219 contains one closing brace too many. The code sample should read as follows: public void set_Age(Int32 value) { If (value < 0) // The 'value always identifies the new value. throw new ArgumentOutOfRangeExceptional( "Age must be greater than or equal to 0"); _Age = value; } } Page 220: Delete Parenthesis ---------------------------- On page 220, in the code listing, next to last line, remove the final parenthesis. Change: return (byteArray[bitPos / 8] & (1 << (bitPos % 8 ))) != 0); To: return (byteArray[bitPos / 8] & (1 << (bitPos % 8 ))) != 0; Page 220: Correction To Code Listing ------------------------------------ On page 220, in the second section of the code listing, there is missing text. Change: if (numBits <= 0) throw new ArgumentOutOfRangeException("numBits must be > 0"); To: if (numBits <= 0) throw new ArgumentOutOfRangeException("numBits" "numBits must be > 0"); Page 221: foreach Should Be for ------------------------------- In the third section of the code listing after the sentence "Using the BitArray type's indexer...", the word "foreach" should be "for". Change: // Show the state of all the bits by calling the get accessor. foreach (Int32 x = 0; x < 14; x++) { To: // Show the state of all the bits by calling the get accessor. for (Int32 x = 0; x < 14; x++) { Page 222: Missing Word ---------------------- On page 222, the word "method" is missing in the first two bulleted items. In the first bullet, change: "...define a get accessor for the property." To: "...define a get accessor method for the property." In the second bullet, change: "...define a set accessor for the property." To: "...define a set accessor method for the property." Page 223: Changes To Code Listing --------------------------------- On page 223, in the second code listing, there are three errors. On the first line, the words "SomeType" should be "BitArray", on the second line the word "as" should be capitalized, on the eighth line "cs.Bit(2)" should be "ba.Bit(2)". Change: ' Construct an instance of the SomeType type. Dim ba as new BitArray(10) ' Visual Basic uses ( ) instead of [ ] to specify array elements. Console.WriteLine(ba(2)) 'Displays True or False 'Visual Basic also allows you to access the indexer by its name. Console.WriteLine(cs.Bit(2)) 'Displays same as previous line NOTE: While not shown in the code samples here, the vertical ellipsis shown in the book should be retained. To: ' Construct an instance of the BitArray type. Dim ba AS new BitArray(10) ' Visual Basic uses ( ) instead of [ ] to specify array elements. Console.WriteLine(ba(2)) 'Displays True or False 'Visual Basic also allows you to access the indexer by its name. Console.WriteLine(ba.Bit(2)) 'Displays same as previous line Page 230: Final Paragraph Should Be Part Of Note Box ---------------------------------------------------- On page 230, the final paragraph, beginning "As you can see, this type is nothing to write home about.", should be part of the Note box immediately above it. Page 232: Missing "virtual" --------------------------- On page 232, the word "virtual" is missing from the second section of the code listing. Change: // 2. A PUBLIC add_* method // Allows objects to register interest in the event. [MethodImplAttribute(MethodImplOptions.Synchronized) ] public void add_MailMsg(MailMsgEventHandler handler) { To: // 2. A PUBLIC add_* method // Allows objects to register interest in the event. [MethodImplAttribute(MethodImplOptions.Synchronized) ] public virtual void add_MailMsg(MailMsgEventHandler handler) { Page 232: Missing "virtual" --------------------------- On page 232, the word "virtual" is missing from the third section of the code listing. Change: // 3. A PUBLIC remove_* method // Allows objects to unregister interest in the event. [MethodImplAttribute(MethodImplOptions.Synchronized) ] public void remove_MailMsg(MailMsgEventHandler handler) { To: // 3. A PUBLIC remove_* method // Allows objects to unregister interest in the event. [MethodImplAttribute(MethodImplOptions.Synchronized) ] public virtual void remove_MailMsg(MailMsgEventHandler handler) { Page 234: Transposed Text In Code Listing ----------------------------------------- On page 234, in the code listing, in the 26th line, the text is transposed. Change: " 'To: (0)\n From: (1)\n Subject: (2)\n Body: (3)\n". To: " 'From: (1)\n Subject: To: (0)\n (2)\n Body: (3)\n". Page 236: Brace Should Be Parenthesis ------------------------------------- On page 236, change the code example near the top of the page from: mm.remove_MailMsg(callback] ; To: mm.remove_MailMsg(callback) ; Page 255: .SubString Should Be .Substring ----------------------------------------- On page 255, in the final code snip, ".SubString" should be ".Substring" Change: if (s.ToLower( ).SubString(10, 20).EndWidth("exe")) { To: if (s.ToLower( ).Substring(10, 20).EndWidth("exe")) { Page 273: Correction To Table 12-4 ---------------------------------- On page 273, in table 12-4, the entry for Member Type for Member Length is incorrect. Change: "Read only property" To: "Read write property" Page 273: Correction To Table 12-4 ---------------------------------- On page 273, in table 12-4, the entry for Member AppendInsert should be broken into 2 separate lines. Change: "AppendInsert" To: "Append Insert" Pages 283-284: Replace Code Listing ----------------------------------- On page 283, replace the code listing beginning at the bottom third of the page (first line: "public StringBuilder AppendFormat(IFormatProvide formatProvider") and continuing on to page 284, with the following: public StringBuilder AppendFormat(IFormatProvider formatProvider, String format, params Object[] args) { // If an IFormatProvider was passed, find out // whether it offers an ICustomFormatter object. ICustomFormatter cf = null; if (formatProvider != null) cf = (ICustomFormatter) formatProvider.GetFormat(typeof(ICustomFormatter)); // Keep appending literal characters (not shown in this pseudocode) // and replaceable parameters to the StringBuilder's character array. while (MoreReplaceableArgumentsToAppend) { // argFormat refers to the replaceable format string obtained // from the format parameter String argFormat = ...; // argObj refers to the corresponding element // from the args array parameter Object argObj = ...; // argStr will refer to the formatted string to be appended // to the final, resulting string String argStr = null; // If a custom formatter is available, let it format the argument. if (cf != null) argStr = cf.Format(argFormat, argObj, formatProvider); // If there is no custom formatter or if it didn't format // the argument, try something else. if (argStr == null) { // Does the argument's type support rich formatting? IFormattable formattable = argObj as IFormattable; if (formattable != null) { // Yes; pass the format string and provider to // the type's IFormattable ToString method. argStr = formattable.ToString(argFormat, formatProvider); } else { // No; get the general format using // the thread's culture information. if (argObj != null) argStr = argObj.ToString(); else argStr = String.Empty; } } // Append argStr's characters to the character array field member. ... } return this; } Page 284: Doesn't Should Be Does -------------------------------- On page 284, in the second paragraph after the code listing, change: "If the object doesn't support IFormattable, [...]" To: "If the object does support IFormattable, [...]" Page 303: Correction To Code Listing ------------------------------------ On page 303, in the code listing, second line from the top, change: "Console.WriteLine("{0,5:D}\t{1:G}",c, c); " To: "Console.WriteLine("{0,5:D}\t{0:G}",c); " Page 310: Section Should Be Chapter ----------------------------------- On page 310, change the very last word on the page, "section", to "chapter". Page 328: this Should Be other In Code Listing ---------------------------------------------- On page 328, in the code listing, third section, change: return (x == this.x) && (y == this.y) To: return (x == other.x) && (y == other.y) Page 337: Error In Code Sample ------------------------------ There is an error in the code sample at the bottom of page 337. Change: menu = gp.GetMenu()); To: menu = gp.GetMenu(); Page 339: private Should Be protected ------------------------------------- On page 339, in the code listing, change: "// NOTE: No public/private used on the next line " To: "// NOTE: No public/protected used on the next line " Page 340: private Should Be protected ------------------------------------- On page 340, in the third and fourth paragraph, and in the sample errors between these paragraphs, there are four instances where the word "private" must be changed to "protected". Change: "Finally, notice that the IComparable.CompareTo method isn't prefixed with a public or private access modifier. In fact, the C# compiler produces one of the following errors if a public or private access modifier is added: error CS0106: The modifier 'public' is not valid for this item error CS0106: The modifier 'private' is not valid for this item The fact that IComparable.CompareTo can't have a public or private access modifier [...]" To: "Finally, notice that the IComparable.CompareTo method isn't prefixed with a public or protected access modifier. In fact, the C# compiler produces one of the following errors if a public or protected access modifier is added: error CS0106: The modifier 'public' is not valid for this item error CS0106: The modifier 'protected' is not valid for this item The fact that IComparable.CompareTo can't have a public or protected access modifier [...]" Page 355: Remove "and" ---------------------- On page 355, in the third paragraph, in the fifth sentence, change: "You'll recall that all CLS-compliant attributes are derived from System.Attribute and this type..." To: "You'll recall that all CLS-compliant attributes are derived from System.Attribute; this type..." Page 374: Correction To Code Listing ------------------------------------ On page 374, in the first code listing (first line: "public void ProcessItems(Feedback feedback) { "), change: " feedback(items[item], item, items.length); " To: " feedback(items[item], item + 1, items.length); " Page 374: Correction To Code Sample ----------------------------------- On page 374, in the code snip after the second paragraph, middle of the page, change: " feedback(items[item], item, items.length); " To: " feedback(items[item], item + 1, items.length); " Page 374: Correction To Code Sample ----------------------------------- On page 374, in the second code snip after the second paragraph, middle of the page, change: " feedback.Invoke(items[item], item, items.length); " To: " feedback.Invoke(items[item], item + 1, items.length); " Page 378: "Feedback" Missing ---------------------------- On page 378, in the code listing at the bottom of the page, third line from the bottom, change: "Feedback fbChain = Delegate.Combine(fbArray); " To: "Feedback fbChain = (Feedback) Delegate.Combine(fbArray); " Page 381: Missing Parenthesis In Code Sample -------------------------------------------- On page 381, in the Note box, in the code sample, a parenthesis is missing. Change: // Do fb and fbChain refer to the same object? "False" Console.WriteLine(Object.ReferenceEquals(fb, fbChain); To: // Do fb and fbChain refer to the same object? "False" Console.WriteLine(Object.ReferenceEquals(fb, fbChain)); Page 473: "would" Should Be "should" ------------------------------------ On page 473, in the comments section of the code listing section beginning "// The common method that does the actual cleanup. ", change: "// If this class weren't sealed, this method would be protected." To: "// If this class weren't sealed, this method should be protected." Page 473: "wouldn't" Should Be "would" -------------------------------------- In the code listing on page 473, line 31, change: "// If this class weren't sealed, this method wouldn't be protected." To: "// If this class weren't sealed, this method would be protected." Page 477: "didn't" Should Be "did" ---------------------------------- On page 477, in the paragraph immediately after the code listing, fourth sentence, change: "For if Finalize didn't execute, [...]" To: "For if Finalize did execute, [...]" Pages 496 & 497: "J" Should Be "K" ---------------------------------- In figures 19-12 and 19-13, on pages 496 and 497, the letter "J" found in the box should be changed to a "K". Page 523: Delete "second version" --------------------------------- On page 523, in the first sentence of the section "Reflecting Over a Type's Members: Binding", change: "In the second version of the Reflector application, [...]" To: "In the Reflector application, [...]" Microsoft Press is committed to providing informative and accurate books. All comments and corrections listed above are ready for inclusion in future printings of this book. If you have a later printing of this book, it may already contain most or all of the above corrections. Additional query words: 0-7356-1422-9 RICHTER ====================================================================== Keywords : kbdocfix kbdocerr Version : : Issue type : kbinfo ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2002.