`
yesjavame
  • 浏览: 688466 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

C#与.NET 3.0高级程序设计(特别版)问题与错误列表

阅读更多

这是一本称为“圣经”的书,入手初看了一下,称“圣经”确实勉强了。其中一些深入的问题作者根本没有理解。

当然首先肯定书不失为一本好书,但问题还是不少,现择录于此。希望再版时能有所修正。

我边读边往这里加。

-------------------------------------------------

如何看"圣经"?

人类历史上那些曾经在某一时期辉煌的经典如璀璨的明星指引着历史中的人们不断前进.但是任何经典都是历史的

产物,也归终于历史........

象thinking in java,或者如同本书,在新技术发展的最初阶段,大多数学习者没有渠道系统全面地了解某一知识体系

的时候,这样的书籍无疑是学习的圣经.就如78年左右"中国的改革开放政策",还被红色的余辉照耀下的人们,对于这

种能给他们的生活,他们的思想带来翻天覆地的变化的伟大思想,除了"圣经"这样的词不足以形容其伟大.但是放眼

今天,学过历史的初中生都已经非常深入地理解和明白"改革开放"的思想内涵和历史背景.在他们眼中,这个政策是

"本应如此"的,何以见其伟大?

反过来说,对于java技术在中国已经有十多年的深入推广,.NET技术在中国已经有五年以上成熟的应用.这些当初的

经典在现在已经显现不出其高深和神圣.说实话我当初对TKJ的崇拜并不比别人低,但现在回过头来看看不过如此.这

本书谈不上思想,最多可以说是比较全面的比较深入地JAVA技术大全.这是任何一个水平在不断发展的技术人员对待

一部经典的正常心理,我们不能否认它们在当初的神圣和辉煌以及它给我们的能力提高所起的巨大指导作用.但我们

也坚决不能把它奉为永恒的经典!回过头来批判地看待正是对它的尊重与怀念.

本着同样的心情,本书出致3.0版,已经称不上圣经.非常简单的一个道理,因为一本书的升级永远不会比你的技术水平

的提高快.就我下面的这些问题,如果在此书第一版面市的时候我就能认识这些问题,那我可能就是全球顶级大牛了.

但我不是,我连普通高手都不是,只是我的水平这本书本身提高得快而已.

-------------------------------------------------

第63页下面那个图说明
public const string BestNbaTeam = "timberwolves";是常量的例子的图中编译后成.field public static literal string BestNbaTeam = "timberwolves"根本说明不了它是常量,应该加上一句调用:
Console.WriteLine(BestNbaTeam);编译后是 ldstr "timberwolves"而不是ldsfld string className::BestNbaTeam这才能说明问题.

-------------------------------------------------

64/65页对readonly的描述不准确确,不是不能改变而是一经赋值就不能重新赋值,简单说变量只能永远指向

最初的那个对象.不能重新赋值,但对象本身可以改变.

static readonly StringBuilder sb = new StringBuilder("axman");
static void Main(string[] args)
{
Console.WriteLine(sb.ToString());
sb.Append(' is a great person!');
Console.WriteLine(sb.ToString());
Console.ReadLine();
}
你完全可以改变sb指向的对象的内容.但你不能再把它指向另一个对象.

static void Main(string[] args)
{
sb = new new StringBuilder("axman1");

Console.ReadLine();
}

其实这和java中final变量的意思是一样的.

-------------------------------------------------

92页的Equals实现还是存在重大设计性错误。作者对陷井并不了解。
按作者的想法实现下面的类,看看是什么结果?
a==b,但b!=a


classPerson...{
publicstringname;
publicintage;
publicPerson(stringname,intage)...{
this.name=name;
this.age=age;
}


publicoverrideboolEquals(objectobj)
...{
if(obj!=null&&objisPerson)...{
Persontemp
=(Person)obj;
if(temp.name==this.name&&temp.age==this.age)returntrue;
}

returnfalse;
}

publicoverrideintGetHashCode()
...{
returnbase.GetHashCode();
}

}


classChinaPerson:Person...{
publicstringcity;
publicChinaPerson(stringname,intage,stringcity):base(name,age)
...{
this.city=city;
}

publicoverrideboolEquals(objectobj)
...{
if(obj!=null&&objisChinaPerson)
...{
ChinaPersontemp
=(ChinaPerson)obj;
if(temp.name==this.name&&temp.age==this.age&&temp.city==this.city)returntrue;
}

returnfalse;

}

publicoverrideintGetHashCode()
...{
returnbase.GetHashCode();
}

}

staticclassProgram
...{
staticvoidMain(string[]args)
...{
ChinaPersoncp
=newChinaPerson('axman',100,'bj');
Personp
=newPerson('axman',100);
Console.WriteLine(p.Equals(cp));
Console.WriteLine(cp.Equals(p));
Console.ReadLine();
}

}

-------------------------------------------------

142页对于引用类型转换,仍然采用了笨拙的方法,浪费性能。

if(e is Manager){

((Manager)e).XXX;

}

这样的调用首先e is Manager要做isinst操作来测试类型,然后再调用castclass来强行转换。

而Manager m = e as Manager只需做isinst,如果返回真就直接用stloc.x操作将e的地址赋给了m.

后面我们只需判断if(m == null)或m!=null来操作m就行了。稍有水平的 .NET程序员应该坚决避免先isinst再

cstaclass这种耗时的操作。

有人说"这里"只是为了说明问题举的简单的例子,没有必要"刻意"表现性能,那么看223页,作者在"刻意"下仍然不

知道直接用as 来简化操作.

-------------------------------------------------

第197/199的clone实现实在是搞笑/愚蠢/无效

首先,197中.

public object Clone(){return new Point(this.x,this.y);}

这种行为本身就是一种非常搞笑的,别说实现得好不好,有这种思维就是一个愚蠢的行为.

clone的目的是什么?就是要通过"复制"而不是new 的方式来生成一个和已有对象状态一致的对象.如果用new 来

实现clone,那么调用者自己不会new ?你new的动作比调用者萧洒?由你new出来的对象比调用者自己new出来的

对象更好控制?既然是new出来的那为什么没事找事加上一个clone?所以这种实现本身就违反clone的意义.且不说

实现得好不好了.

我们再看199页所谓的深复制,Point的成员变量PointDescription有一个成员变量petName,所以作者new 了一个

PointDescription又复制了petName.如果PointDescription的成员变量又包含成成员变量,这样多级的引用呢?按

作者实现思路如何递归并反射进行赋值?如果是私有成员变量你还能给它赋值?这样的代码能实现真正的深复制?

我就想不通一般普通程序员都知道的用序列化实现对象的深复制,到了大师手里就这么难呢?

public object Clone() {
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, this);
ms = new MemoryStream(ms.ToArray());
return bf.Deserialize(ms);
}

这样一段对所有要实现深复制的对象都适用的代码难道不比那种要手工不断递归赋值也不能完全深复制的代码强?

我们要做的仅仅是在类前面加一段 [Serializable]而已.(不要钻牛角尖说有些字段不可序列化,那样的情况先反序列化得到一个新对象后再手工生成不可序列化字段也比递归反射再一个一个赋值要高明且完全得多)

-------------------------------------------------

第213页最下面"奇怪的是,同步Invoke()不能直接在C#中调用",我奇怪的是我为什么有直接调用?RP问题?

delegate void Test();

class Program
{
static void t() {
Console.WriteLine("Axman!");
}
static void Main(string[] args)
{
Test t1 = new Test(t);
t1.Invoke();
Console.ReadLine();
}
}

-------------------------------------------------

第267页 使用泛型后加入值类型后,作者说从编译后的IL看到没有Boxing和Unboxing操作,虽然结果巧合是正确的,

但这个说明是完全错误的,假如泛型也是完全基于堆来实现,List<int>对象的Add方法完全可以接收一个值类型后

在方法类Boxing,获取方法完全可以在方法内UnBoxing后再返回值类型.仅从编译后那几行IL不可能说明泛型没有

执行Boxing和Unboing操作.真正说明问题的是显示List<int>对象的_items成员,这个成员是根据传入的类型生成

的该类型数组,List<int> 时就是int[ ] 数组来存放Add加入的数据,这才可以说明没有发生Boxing和Unboing.

-------------------------------------------------

第161页 对表示状态的关键全局变量的改变竟然没有同步,disposed = true;完全是一个初级程序员的思维,任何

两个线程同时运行都有可能使这个"正式的可处置模式"失败.

分享到:
评论

相关推荐

    C#与.NET3.0高级程序设计(特别版)

    C#与.NET3.0高级程序设计(特别版)

    C#与.NET 3.0高级程序设计(特别版)(仅源代码)

    《C#与.NET 3.0高级程序设计(特别版)》是一本深入探讨C#编程和.NET 3.0框架应用的专业书籍。该书涵盖了C#语言的高级特性和.NET 3.0框架下的核心服务,旨在帮助开发者提升技能,实现更高效、更灵活的软件开发。 1. ...

    C#与.NET3.0高级程序设计(英文版)

    ### C#与.NET 3.0 高级程序设计 #### 概述 《C#与.NET 3.0 高级程序设计》是一本在C#编程领域内享有盛誉的经典著作,由微软C# MVP Andrew Troelsen撰写。本书不仅深入地探讨了C#编程语言的核心概念和.NET平台的基本...

    C#2005.NET3.0高级编程(第5版-中文

    在《C# 2005 .NET 3.0 高级编程》这本书中,你可以学习到如何利用C# 2005与.NET 3.0框架进行深度集成,创建高性能、高可用性的应用程序。第13章可能涉及了高级主题,比如并发控制、异常处理、性能优化、设计模式以及...

    C# with.NET 3.0, Special Edition(附源代码) )19233519501.zip

    《C#与.NET 3.0特别版》是面向程序员的一本专业书籍,它深入探讨了C#编程语言以及.NET Framework 3.0的核心技术。这本书不仅提供了丰富的理论知识,还附带了源代码,使得读者能够通过实践来加深对所学内容的理解。 ...

    C# 2005 & .NET 3.0高级编程(第5版.上、下卷)

    《C# 2005 & .NET 3.0高级编程(第5版.上、下卷)》是一本全面深入探讨C#语言和.NET Framework 3.0平台的权威指南。这本书分为上下两卷,旨在帮助读者掌握C# 2005语言的高级特性,以及利用.NET 3.0框架开发高效、可靠...

    C#与.NET 3.5高级程序设计第4版对应源码

    《C#与.NET 3.5高级程序设计》是一本深入探讨C#编程语言和.NET Framework 3.5平台的经典著作。这本书旨在帮助开发者掌握C#的高级特性,并利用.NET Framework 3.5的强大功能来构建高效、健壮的应用程序。源码文件包含...

    C#与.NET 3.5高级程序设计

    《C#与.NET 3.5高级程序设计》是一本专为有经验的程序员准备的指南,它深入探讨了C#...《C#与.NET 3.5高级程序设计(第4版)》.pdf这个文件很可能包含了这些详细内容的讲解和实例,是提升C#与.NET技术能力的宝贵资源。

    C# 2005 net3.0高级编程(第5版)

    这本书涵盖了C#语言的核心特性和高级特性,同时也深入探讨了.NET 3.0框架下开发的应用程序设计与实现。 首先,C# 2005是微软推出的面向对象的编程语言,其设计目标是为构建Windows应用程序、Web服务和XML Web服务...

    C#与.NET3.5高级程序设计(中文版第4版)B

    《C#与.NET3.5高级程序设计(中文版第4版)》是一部深度剖析C#编程技术及其在.NET3.5框架下应用的权威著作。本书覆盖了多个关键主题,包括C#语言特性、.NET程序集、事件处理、泛型、LINQ等,旨在帮助开发者提升对C#...

    [C#与.NET.3.5高级程序设计(第4版)]

    《C#与.NET.3.5高级程序设计(第4版)》这本书是针对C#编程语言和.NET Framework 3.5平台的一本深入指南。它涵盖了C#语言的高级特性和.NET Framework 3.5中的核心开发技术,旨在帮助程序员提升在Windows应用开发中的...

    C# 3.0与.NET 3.5高级编程

    《C# 3.0与.NET 3.5高级编程》是针对微软.NET框架3.5版本中的核心技术进行深入探讨的教程,特别是针对C# 3.0的新特性进行了详尽解析。本教程旨在帮助开发者从基础知识出发,逐步掌握.NET 3.5平台上的高级编程技巧,...

    C#与.NET.3.5高级程序设计(第4版)11-15章

    《C#与.NET.3.5高级程序设计(第4版)》是深入学习C#编程和.NET框架的重要参考资料,涵盖了C#语言的关键特性和.NET Framework的核心概念。本部分主要探讨了第11至15章的内容,这些章节分别涉及委托、事件、Lambda...

    C#和.net3.5高级编程

    书中不仅覆盖了C#语法的基础知识,还特别关注了面向对象编程、泛型、Lambda表达式、LINQ、并发处理、WCF服务、ASP.NET MVC框架等高级主题。以下是对这些知识点的详细阐述: 1. **C#语言特性**:C#是一种强类型、...

    C#与.NET.3.5高级程序设计(第4版)26-30章

    《C#与.NET.3.5高级程序设计(第4版)》的第26-30章涵盖了多个关键的.NET开发技术,包括Windows Workflow Foundation (WF),Windows Forms,以及Windows Presentation Foundation (WPF)的核心概念。以下是这些章节中的...

    FastSpring.net V3.0全部源码

    《FastSpring.net V3.0源码解析与技术探讨》 FastSpring.net是一个基于C#和.NET框架的开源项目,其V3.0版本的源码具有重要的学习和研究价值。自V2.5之后,作者停止了更高版本的更新,使得V3.0成为了一个里程碑式的...

    [转]c#.net 2005 windows应用程序界面美化

    C#.NET 2005在Windows应用程序开发中引入了许多新的特性和改进,特别是在界面设计方面。开发者可以通过使用Visual Studio 2005 IDE的内置工具,轻松地创建出专业级别的用户界面。这涉及到对标准控件的样式调整、使用...

Global site tag (gtag.js) - Google Analytics