Effective .NET演讲圆满结束,拖着疲惫的身体回到家,非常感谢大家的支持。
唯一的遗憾是时间安排太紧,一些item匆匆过了,而没有深入的展开,还有一些item由于考虑到讲座的覆盖度,没有列出。这些主题将会在我将来的书稿中得到完整的体现。
我会把Effective C++/CLI努力写好,也希望大家能贡献自己的智慧,一起来完善这本书。
打印 | 张贴于 2005-01-23 22:12:00 | Tag:程序人生
随笔 - 13, 评论 - 266, 引用 - 26 |
||
|
Effective .NET演讲圆满结束,拖着疲惫的身体回到家,非常感谢大家的支持。 唯一的遗憾是时间安排太紧,一些item匆匆过了,而没有深入的展开,还有一些item由于考虑到讲座的覆盖度,没有列出。这些主题将会在我将来的书稿中得到完整的体现。 我会把Effective C++/CLI努力写好,也希望大家能贡献自己的智慧,一起来完善这本书。 打印 | 张贴于 2005-01-23 22:12:00 | Tag:程序人生 对不起,目前本随笔不允许发表新评论.
|
||
|
Powered by: Joycode.MVC引擎 0.5.2.0 Copyright © 李建忠 |
||
留言反馈
Scott Meyers 写他的名作时,C++已经出来很长时间了,有大量的实践,才可以谈effective的。 还是等C++/CLI有了较多实际应用,再写这个题目吧,没有实际项目的经验,没有大量代码的积累,这个是不现实的,写不出经典。
你还是写一本prime系列的比较好
抱歉,由于俱乐部将独立运作,网站正在改版,不宜再放在祝成科技的主页上,活动记录、照片和ppt将于近日放在新的俱乐部网站上,希望大家理解。今年俱乐部会开展更多的活动,感谢大家支持。
这是整个CLR设计的缺陷(也许CLR的设计人员并不认为这是一个缺陷),所有.NET语言都会有这个问题。目前来说只能靠程序员自己来避免。
其实只要认真听了李老师的讲座就会对这个问题非常清楚。
老师已经多次指出,在c++中这个问题是可以避免的,在c++中基类的构造函数如果调用虚函数那么只会调用基类定义的,而不会调用子类重载的。
你可以看成是c#的缺陷,也可以当作是编程的一种技巧。
可能我在会场上的表达太快,这一条item让你产生了误解。下面我详细解释一下。这一item是这样写的:
# 避免在实例构造器中调用虚方法——无论是直接还是间接(虚方法先于构造器调用)
这里出问题的条件是“在实例构造器中调用虚方法”,如果在其他地方调用虚方法,则不存在任何问题。
看下面的代码:
using System;
class Base
{
public Base()
{
Console.Write("Base construct Load!\n");
this.AA(); //注意,这是我们需要避免的动作
}
public virtual void AA()
{
Console.Write("Base AA Load!\n");
}
}
class BaseChild:Base
{
public BaseChild()
{
Console.Write("BaseChild construct Load!\n");
}
public override void AA()
{
Console.Write("Base BaseChild AA Load!\n");
}
}
class Class1
{
static void Main(string[] args)
{
BaseChild bc=new BaseChild();
}
}
Base construct Load!
Base BaseChild AA Load!
BaseChild construct Load!
在BaseChild还没有构造出来的时候,BaseChild中重写的AA方法已经执行了——这就是问题所在“当一个object还没有完成初始化,就让它去行使行为是没有道理的”。
class Base
{
public Base()
{
Console.Write("Base construct Load!\n");
}
public virtual void AA()
{
Console.Write("Base AA Load!\n");
}
}
class BaseChild:Base
{
public BaseChild()
{
Console.Write("BaseChild construct Load!\n");
}
public override void AA()
{
base.AA ();
Console.Write("Base BaseChild AA Load!\n");
}
}
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
///
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
BaseChild bc=new BaseChild();
bc.AA();
Console.Read();
}
}
事实上,顺序是:
Base construct Load!
BaseChild construct Load!
Base AA Load!
Base BaseChild AA Load!
不知道李建忠老师有没有这个意向。
至于各论坛的联系,就由我来操办好了。
盼回复。
想想有点对不起我们的客户,以前在做项目时并没有刻意考虑这些effective的准则。
不过以后就一定会注意了。
另外,那个金黄色的杯子很可爱,呵呵。
希望尽早放出ppt.
听得意犹未尽。
然则后面的交流,由于要赶回苏州,所以没办法继续了...
希望以后有机会多参与这样的线下交流
呵呵,谢谢大伙对我的帮助
希望PPT文档尽快提供下载。
我这里还有一些EFFECTIVE的经验还没来的急分享。
以后能多多举办这些活动。
我也会尽快完善我的架构理念。同时谢谢各位的帮助:)
希望Effective C# 一书早日出版