Errata

Programming C#

Errata for Programming C#

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.

Color Key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted by Date submitted
Printed Page 6

paragraph 6, name of the second author
should be read as Hoang instead of Hoag.

Anonymous   
Printed Page 14
Example 2-3

Example defines class Hello.

text that follows describes class HelloWorld instead.

Anonymous   
Printed Page 16
The static Keyword: 1st sentence after the code

Not sure if the static keyword means there is no creation of an object of type Hello class or type HelloWorld class. (Please refer
to the Hello World example on page 9, 11, 14, and 15. You say HelloWorld class the first time, but Hello class the other times.)

Anonymous   
Printed Page 25
table 3-1

char is listed as taking up one byte. Char's in C# are, as listed, Unicode characters and thus must take up 2 bytes. Visual Studio.Net documentation confirms this.

Anonymous   
Printed Page 25
table

The table says that char has a size of 1 byte. In fact the C# language specification
in section 4.1.4 says that it has a length of 16 bits (2 bytes).

Anonymous   
Printed Page 26
end of 2nd para

"...while a ulong can hold values from 0 through 4,294,967,295." Maximum value should be 18,446,744,073,709,551,615?

Anonymous   
Printed Page 26
table of built-in value types

The maximum value for a ulong is given in hexadecimal, with 0x notation, which isn't
introduded yet in the text. All other values (even those for long which is +/-9
quintillion) are given in decimal. Surely the maxiumum value for a ulong should also
be given as a decimal (18,446,744,073,709,551,616) or as ~18.5 quintillion.

Anonymous   
Printed Page 26
table of build-in value types

The minimum value for an int is given as -2,147,483,647; it should be -2,147,483,648
(one less) as it is a 32-bit twos complement number. (Note that all signed types are
twos complement and so their lower bound is even).

Anonymous   
Printed Page 27
Box: the stack and the heap

Stack is described, but heap is not

Anonymous   
Printed Page 33
bottom of page 33/top of page 34

The examples in the the discussion of enumerations starting on page 32
do not work as written with CS .NET Enterprise Beta 2.

As far as I can tell, an explicit cast, for example,

System.Console.WriteLine{"Freezing point of water: {0}",
(int)Temperatures.FreezingPoint );

is needed. Without the cast, the text of the label of the enumeration
element rather than its value is displayed. In the docs I found

"The underlying type specifies how much storage is allocated for each
enumerator. However, an explicit cast is needed to convert from enum type
to an integral type."

Anonymous   
Printed Page 38
2nd paragraph

2nd line reads: [...] continue, return, or statementhrow
Assuming it should have been just "throw"

Anonymous   
Printed Page 42
3rd paragraph

The sentence: "Because any nonzero value evaluates to true in C and C#" should
read: "Because any nonzero value evaluates to true in C and C++".

Anonymous   
Printed Page 45
Example 3-10

The indentation in many of the examples is quite poor, but this one is particularily bad. The following part was confusing:
if (i < 10)
goto repeat;
return 0;

Anonymous   
Printed Page 47
top of page

"do expression while statement" should be stated "do statement while
expression".

Anonymous   
Printed Page 49
Text box, last code snippet

The code will not compile as too many braces have been shaved off. The variable "i" is not available for the "if" statement.

Anonymous   
Printed Page 49
box on Whitespace and Braces

oOn page 49 in the section on Whitespace and Braces the last example will not work since without the braces for the for statement the if statement is no longer part of the for statement and i is therefore out of scope. And even if it was the if statement would only be executed once after all the iterations through the loop.

Anonymous   
Printed Page 49
3rd example in Whitespaces and Braces box

The example removes both sets of braces and indicates that the program would remain
unchanged, when this is not the case.

The original program includes two statments inside the first if statment: the
Console.Write and 2nd if statement.

The revised version includes only the Console.Write statement. The 2nd iff statement
would only be evaluated once, after exiting the first if statement.

Anonymous   
Printed Page 49
the last code snippet

is written as:

for (int i = 0 ; i < 100 ; i++)
Console.Write("{0} ", i);

if (i % 10 == 0)
Console.WriteLine(" {0}", i);

while it needs to be written as:

for (int i = 0 ; i < 100 ; i++)
{
Console.Write("{0} ", i);
if (i % 10 == 0)
Console.WriteLine(" {0}", i);
}
You took out one set of braces too many.

Anonymous   
Printed Page 56
table

In the second line, in the third column the operator should be ==
instead of =

Anonymous   
Printed Page 65
First sentence

Should read "#endregion", not "#end region"

Anonymous   
Printed Page 77
at the bottom there is the following code

public void SomeMethod (int hour)
{
this.hour =3D hour;
}

Previously the book is using a running example of a class 'Time' that =
has a member field of 'Hour' (capitialized).

On page 78, in discussing the code above, the text reverts to the Pascal =
Hour.

Anonymous   
Printed Page 81
3rd Paragraph

The last sentence says that without a public constructor it will not be possible to
create an instance of the class. This is not true. It is possible to have only a
private constructor and a public static method that calls the constructor. Some
consider this approach to be better that having a public constructor as it means that
all the public methods can be in an interface resulting in better decoupling between
types & implementation.

Anonymous   
Printed Page 97
Top of the page

Figure 5-2 and Figure 5-3 are indentical, but figure 5-3 is supposed to show an
expanded UML representation of windows widgets...

Anonymous   
Printed Page 113
there is the definition for an abstract calss called

Window. Within the Window class, two variables are defined called top and left. The
comment that appears above them reads;

// these members are private and thus invisible
// to derived class methods. We'll examine this
// later in the chapter.

Then the two variables are declared immediately after, thus;

protected int top;
protected int left;

The access modifier provided in the declaration is protected, not private so the two
variables are not invisible to derived class methods.

Anonymous   
Printed Page 116
last line

the method string ToString() in the last line is described as virtual.

as far as i understood it should be override NOT virtual.

in later examples the override is used also.

Anonymous   
Printed Page 120
tip: Java programmers take note

static and non-static switched

nested classes are roughly equivalent to inner classes (non-static);
there is no C# equivalent to Java's static nested classes.

also:
inner class is Java's term for non-static nested classes.
static nested classes are just called static nested classes.
static inner class is a contradiction.

Anonymous   
Printed Page 121
Last line on page

"FractionArtist is public".
It appears to be defined in the example as "internal".
[Yes, it can be accessed from outside Fraction -- in that sense it is
"public" -- but it's not REALLY "public"

Also, that sentence seems to be worded badly: "it is scoped to within the Fraction class"?!?!

Anonymous   
Printed Page 124
4th Paragraph, under the discussion on "The Equals Operator"

Last sentence of this paragraph states "Thus, for example, ArrayList expects you to implement Equals().", where the author must hav
e meant:

"Thus, for example, Fraction expects you to implement Equals().",

since the "ArrayList" word in the previous sentence is not consistent with the ongoing discussion prior to this topic, where the au
thor was using a "Fraction" class as an example.

Anonymous   
Printed Page 128
code under 1st paragraph

"return new Fraction(theInt,1)" should read "return new Fraction(theInt)" for it is referring to the conversion operator in example 6-1, and is calling to the constructor that only takes an integer as an argument, as it is stated on the paragraph after the code.

Anonymous   
Printed Page 143
Last sentence

"Running this modified example..."

Is the example missing?

Anonymous   
Printed Page 159
under "static void Main()" half way down the page

Document theNote = new note("Test Note");
should be:
Document theNote = new Document ("Test NOTE");

Anonymous   
Printed Page 175
"Owl" tip

Should read

Button[] myButtonArray = new Button[3]

Anonymous   
Printed Page 177
Example 9-2 line

empArray[i]=new Employee(i+10)

should read

empArray[i]=new Employee(i+5)

as in example 9-1 if the output is to agree,

Anonymous   
Printed Page 187
last line of code

comment in Example 9-7 reads:
// initialize each Employee's vaue

should be:
// initialize each Employee's value

Anonymous   
Printed Page 214
Missing method in program 9-14

When I entered this program, I get a compiler error
"No overload for method 'Add' takes two integers"

Anonymous   
Printed Page 227
Code Sample Console.WriteLine("myHashTable["000145938"]: {0}",hashTable[

"000145938"]);;
The quotation marks with the string index for myHashTable within the Console.Wr
iteLine string needs to be escaped. In other words the code should read:

Console.WriteLine("myHashTable["000145938"]:{0}",hashTable["000145938"]);

Anonymous   
Printed Page 231
1st section of source code on page

Iconvertible should be IConvertible in the declaration given for class String

Anonymous   
Printed Page 237
1st paragraph

The first paragraph says: In this case the output properly indicates that s1 is "less than" s2.
In Unicode (as in ASCII), a lowercase letter has a smaller value than an uppercase letter.
How can "a" which is decimal value 97 in the ASCII table be smaller than "A" whose decimal value is 65??

Anonymous   
Printed Page 288
2nd Code first Line

studentPair.Sort(theStudentDelegate);
Build error

Should be

studentPair.Sort(Student.OrderStudents);
No Build Error

Anonymous   
Printed Page 291
3rd code block

Surely the lines:

public DoEffect BlurEffect = new DoEffect(Blur)
public DoEffect SharpenEffect = new DoEffect(Sharpen)
public DoEffect FilterEffect = new DoEffect(Filter)
public DoEffect RotateEffect = new DoEffect(Rotate)

should read:

public static DoEffect BlurEffect = new Blur()
public static DoEffect SharpenEffect = new Sharpen()
public static DoEffect FilterEffect = new Filter()
public static DoEffect RotateEffect = new Rotate()

I have not tested this yet, but there is nothing in the text to explain how the DoEffect
delegate can be constructed with a function as a parameter.

Anonymous   
Printed Page 294
5rd paragraph

I think the SetCheck() method has some minor problem. In your book, you write these
private void SetCheck(TreeNode node, bool check)
{
node.Checked = check;
foreach (TreeNode n in node.Nodes)
{
if (node.Nodes.Count == 0)
{
node.Checked = check;
}
else
{
SetCheck(n,check);
}
}
}

It can not run correctly. I have seen the last update source code for downloading in
your website. In the source code, the SetCheck has changed to
private void SetCheck(TreeNode node, bool check)
{
// find all the child nodes from this node
foreach (TreeNode n in node.Nodes)
{
n.Checked = check; // check the node

// if this is a node in the tree, recurse
if (n.Nodes.Count != 0)
{
SetCheck(n,check);
}
}
}

Though it can work correctly. But I think the if statement (judge if n.Nodes.Count!=0
and SetCheck) is unnecessary. Because when n.Checked=check is execute, it will
activate the AfterCheck event again, then we have already a recursive. Do not need a
if stament and SetCheck to form another recursive.
I have removed if(n.Nodes.Count !=0) statement, and the result is fairly well. Please
consider my opinion.

Anonymous   
Printed Page 315
third code example

The example says:
one:btnCancel.Click +=
new System.EventHandler (this:btnCancel_Click);

The text "one:" should be deleted.

Anonymous   
Printed Page 331
Second half of page

The implementation of tvwSource_AfterCheck calls SetCheck, which sets the Checked
attribute of the calling node to the passed in value. This triggers the AfterCheck
delegate and results in an infinite recursion.

This is with the version 3705 of the .net framework.

To fix it, change tvwSource_AfterCheck code to the following and remove the SetCheck
function. The n.Checked line below triggers the AfterCheck delegate and gives the
desired recursion.

protected void tvwSource_AfterCheck(
object sender,
System.Windows.Forms.TreeViewEventArgs e)
{
foreach (TreeNode n in e.Node.Nodes)
{
n.Checked = e.Node.Checked;
}
}

Anonymous   
Printed Page 335
Last code sample

The line
FileInfo file = new File(fileName);

should read
FileInfo file = new FileInfo(fileName);

Anonymous   
Printed Page 368
Example 14-1

The book breaks the coding standards that are specified within the book (page 15) in
many places (mainly with regards to capitalization of variable names), but this
listing is particularly bad:
DataSet DataSet = new DataSet();
Here an object is given the same name as the class.
In the same code listing there is also:
SqlDataAdapter DataAdapter = ...

Anonymous   
Printed Page 405
Figure 15-2

Web Application icon should have a name as "ASP.NET Web Application".

Anonymous   
Printed Page 405
1st paragraph

Original: The solution files and other ... in <drive>Documents and
<drive>Settings<user name>MyDocumentsVisual Studio Projects...

Should be: The solution files and other ... in <drive>Documents and Settings<user
name>My DocumentsVisual Studio Projects...

1) Remove the word <drive> before Settings.
2) The word "and" should be italiced since it is part of a pathname. (Please refer
to the Conventions mentioned in page xvi.)
3) "MyDocuments" should be "My Documents". There is no folder with name
"MyDocuments".

Anonymous   
Printed Page 405
3rd line of last paragraph

"View Code in the pop-up menu." should be: "View Code" in the pop-up menu.

Anonymous   
Printed Page 405
2 line of last paragraph

WebForm1.cs should be WebForm1.aspx.cs

Anonymous   
Printed Page 406
last line of 2nd paragraph

HelloWeb.cs should be HelloWeb.aspx.cs

Anonymous   
Printed Page 406
Example 15-2

2nd line should be: Codebehind="HelloWeb.aspx.cs"

After the beginning <% %>, there should be a line start with <!DOCTYPE ...>

After the <meta name="CODE_LANGUAGE" Content="C#"> line, there should be 2 more line
with meta content.

Anonymous   
Printed Page 406
code fragment after Example 15-1

Again the Codebehind="HelloWeb.cs" should be Codebehind="HelloWeb.aspx.cs"

Anonymous   
Printed Page 406
last paragraph

HelloWeb.cs should be changed to HelloWeb.aspx.cs

Anonymous   
Printed Page 407
Figure 15-2

The figure displays the wrong output. It displays the form developed in chapter 13
(shown in Figure 13-1). It should be displaying a screenshot of IE showing a white
page with the message "Hello world! It is now" followed by the current date & time.

Anonymous   
Printed Page 407
2nd code listing

- Pow(a, 0) should return 1, but it returns a!
This implementation says a^0 = a^1 which is not true for all the a's.

- The method doesn't handle exponents correct if they are not ints
8.666^4.74 should be treated as (8.666 ^(474/100)) not (8.666^4)

- Also negative exponents are not handled with this method. 8.666^(-4) is (1/(8^4))

Anonymous   
Printed Page 411&412
bottom 1/4 of 411 top 1/42of 412

Space between System.Data. & SqlClient (twice).
Should be System.Data.SqlClient
(411 only)

SQLConnection used instead of SqlConnection (both pages).
e.g System.Data.SqlClient.SQLConnection should read
System.Data.SqlClient.SqlConnection
also
System.Data.SQL.SQLCommand should be System.Data.SqlClient.SqlCommand
(in code examples on both pages 411 and 412)

Anonymous   
Printed Page 412

Text after 2nd code example refers to SQLDataSetCommand and assigns SQLCommand (which
should be SqlCommand) to it. Example code after this relates to myCommand, a
SqlCommand object not a SQLDataSetCommand (which I'm pretty sure doesn't exist).

Anonymous   
Printed Page 424
pow method

Despite the fact that the pow method takes two double arguments, it will return an
incorrect result if the power is negative or non-integer. Maybe it would be better
for the method to use System.Math.Pow instead of attempting to calculate the result.

Furthermore the name of the function is in lowercase which is not consistent with the
other web methods in the example (Add, Sub etc), or the C# coding standards.

Anonymous   
Printed Page 465
last sentence

At the bottom of the page it says that typeof returns an object of type Type which derives from MemberInfo.

On the next page in the "owl" section it says that MemberInfo derives from Type.
which is it???

also, the statement:

System.Reflection.MemberInfo inf = typeof(MyMath)

is confusioning because the return from typeof(MyMath) didn't require a cast. If typeof returns Type and MemberInfo derives from type then how can this statement work. I'm sure it's correct, it's just that i don't understand it.

Anonymous   
Printed Page 527
Example 20-1 code

I haven't run this program yet, example 20-1, but it seems fairly clear that threads one and two will be started, then, while they are running, DoTest will return, and then Main will return, and the program will end because the main thread has ended. wjithout threads one and two being able to complete their work.

Also, I don't see any reason for these threads to be run outside of Main, and why there needs to be an instance created of the Tester class.

Anonymous   
Printed Page 529
3rd paragraph from bottom

The text states that a millisecond is 1000 nanoseconds, which is wrong :

1 sec = 1 000 milliseconds = 1 000 000 microseconds = 1 000 000 000 nanoseconds

Anonymous   
Printed Page 564
Code sample near the middle of the page

"FileInfotheSourceFile" should read "FileInfo theSourceFile"

Anonymous   
Printed Page 579
Example 21-10

Variable declarations should be located at the TOP of a class, not the bottom. Especially
when you have a class that starts on one page and ends on another. I was left scratching
my head wondering where these magical undeclared variables came from... until I turned
the page.

Anonymous   
Printed Page 590
middle of code sample

I suggest rewritting this section of code:
int bytesRead =
reader.Read(buffer,0,BufferSize);
if (bytesRead == 0) // none? quite
fQuit = true;
else // got some?
{
// display it as a string
string theString = new String(buffer);
Console.WriteLine(theString);
}

Like so:
int bytesRead =
reader.Read(buffer, 0, BufferSize);

if (bytesRead < BufferSize) // didn't fill buffer? quit
fQuit = true;

if (bytesRead > 0) // got some?
{
// display it as a string
string theString = new String(buffer);
Console.WriteLine(theString);
}

Two points:
- When I run it as is, the client never finishes, because I never get a zero length buffer.
I get one buffer of length 86. This may be because the file I used is smaller than one
buffer in size.

- In the comment "quite" should be "quit"

Anonymous   
Printed Page 594
"Using a Formatter", paragraph 2

"Formatter classes implement the interface Iformatter"
The F in Iformatter should be capitalised (should be "IFormatter") - this is the name
of an interface, so is case sensitive.

Anonymous