RSS 2.0 Feed
2008-09 Entries
摘要:很多消费者买了电脑的主要目的是上网站浏览新闻,写电子邮件,做电子商务等。即使在旅途中,或者在度假时,我们对一台笔记本的依赖性也是很大的。 功能很强大(适合编程,游戏,多媒体)的笔记本很重。很轻的笔记本很贵。智能手机也可以上网但是月费和可用性仍然不能让人满意。市场需要一种价廉物美的小巧笔记本,而来自DELL的Inspiron Mini 9就有可能适应了市场的需要。 从其产品网页上可以看到该笔记本 支持有线和无线上网,蓝牙,USB 支持Windows XP 使用固态硬盘,Intel Atom处理器,内存从512M到1G 重量是2.3lb约1.08公斤 8.9英寸显示器,1024X600分辨率 4小时的电池使用时间 长宽高大致是:23厘米X17厘米X3厘米 DELL的Inspiron Mini 9有潜力成为需要偶尔使用笔记本的消费者的首选,以及常规笔记本使用者的第二笔记本配置。 您的观点如何?...[阅读全文]

posted @ | Feedback (0) | Filed Under [ 只言片语 ]

摘要:如果我们有如下的类定义: public abstract class FruitBase { }   public class Apple : FruitBase { }   public class Orange : FruitBase { }   public class FruitCollection : System.Collections.ObjectModel.Collection<FruitBase> { }   public class Menu {     public FruitCollection Fruits { get; set; } } 对于Menu的一个实例,比如olympicMenu,其Fruits属性可能只含有Apple,但是也许全是Orange,或者是多种FruitBase字类实例的集合。 如果我们还定义了Fruit这样一个类: public class Fruit : FruitBase { }   这样就很有可能让一些程序员产生错觉了,以为Apple, Orange都是Fruit的子类。而Menu的Fruits这个名字,似乎也提示其是Fruit的集合,而不是FruitBase的集合。   在一个需要对olympicMenu.Fruits中的每个实例进行检查的代码中,如果程序员忘掉了这一点,就可能会写出这样的代码:   for (int i = 0; i < olympicMenu.Fruits.Count; i++) {     Fruit f = olympicMenu.Fruits[i]; //...Op on f }   幸运的是,编译器会给出这样的错误信息:Cannot implicitly convert type ‘FruitBase’ to ‘Fruit’. An explicit conversion exists (are you missing a cast?)   因为explicit必须显示写出,程序员的错误得以避免。但是,foreach显然是要比for循环更简练。如以下的代码所示:   foreach (Fruit f in olympicMenu.Fruits) { //...Op on f } 这个代码却不再会得到编译器的错误提示了!foreach隐含了显式的类型转换!编译通过!如果在调试运行时olympic.Fruits的元素都是Fruit类型,这个错误也不能在调试时发现。这样发布的产品就有了这样一个bug。在运行时,如果olympic.Fruits含有Orange, Apple类的实例时,InvalidCastException将会出现。   FruitBase这个抽象类,就这样又被人记起了。   === 写这个blog,是因为今天分析了一个在已经发布的SP1中的bug。VS 2008 SP1的代码中并没有FruitBase, Fruit, Apple, 和Orange, 但与之相对应的有WPF中的:TriggerBase, Trigger, MultiTrigger, 和DataTrigger.   这行代码, foreach (Trigger trigger in curStyle.Triggers) 导致了一个需要通过发布补丁的大bug. 成本是很大的。如果Trigger的命名是PropertyTrigger,不但可能避免这个混淆,而且也更加精确地描述了其功用。   回想几年前WPF还在开发的时候,我就提出过这一意见。当然有支持的声音。但是最后还是用Trigger这个名字了。其最有力的理由是什么呢?   且听微软实录下一篇。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ C# ]