Effective C# 精髓 (待续)

    昨天买了一本《Effective C#》,看了几个Item,虽然没有当初读《Effective C++》时的那般震撼,但是也收获不少。把其中的要点记录于下,有些条款加上了自己的理解,权当作读书笔记吧 :-)

Item 1: Always Use Properties Instead of Accessible Data Members
    这个是地球人都知道的条款了。你需要记住,属性是类的外部接口部分,而(公共)成员却是内部实现。如果把内部实现暴露给外部,对于以后类的实现变更是非常不利的。

Item 2: Prefer readonly to const
    这个条款需要注意一下几点:
(1)const在编译期发生作用,即编译器会将所有的const成员置换成对应的常量“值”。
(2)即使引用其他程序集中的const成员,本程序集中也是硬编码了const成员的值。
(3)readonly在运行期被评估,所以其性能比const稍差,但是灵活性更高。
(4)const的值必须在编译期决定,所以不能使用new为其赋值。
(5)更新一个公有的const成员的值应被视为接口改变,而更新一个readonly变量的值可视为内部实现的改变。

Item 3: Prefer the is or as Operators to Casts
(1)is或as称为“动态转换”,是尝试性的,如果失败,不会抛出异常。尽可能使用as操作符。该机制使用元数据完成功能。
(2)Cast称为“强制转换”,如果失败,则抛出异常--代价高昂。
(3)is、as、Cast转换都不会调用自定义的转换操作符。
(4)is可以判断一个object是否为值类型,而as不行。
(6)请注意Type.IsAssignableFrom()和Type.IsSubclassOf()方法,他们也是常用的“类型检测”手段。注意,Type.IsSubclassOf()方法不支持接口检测,而Type.IsAssignableFrom()支持。

Item 4: Use Conditional Attributes Instead of #if
    使用#if常(可能)导致性能问题(如空方法调用)和程序对#if/#endif块代码的依赖问题。
(1)使用Conditional Attributes修饰的方法总是会被编译到目标程序集中,无论是Release或Debug。
(2)如果条件不满足该Conditional Attributes指定的条件,则编译器会忽略所有对其修饰的方法的调用。
(3)被Conditional Attributes修饰的方法必须返回void,这是有道理的。因为我们的程序运行不能依赖被Conditional Attributes修饰的方法的返回值。否则,在不同的条件下,我们的程序将表现出非我们期望的不用行为。

Item 5: Always Provide ToString()
    关于这一点,我在以往的项目中早有体会。举个例子,曾经我们需要把从数据库中取出的Customer列表绑定到ComboBox,开始时我们设计Customer时并没有重写ToString()方法,所以我们要这样做:

            //从数据库中挑出所有有效用户
            string whereStr = string.Format("where {0} = '1'" ,Customer._IsValid) ;
            Customer[] customers = (Customer[])DataEntrance.GetObjects(typeof(Customer) ,whereStr) ;
            ArrayList cusNameList = new ArrayList() ;
            foreach(Customer cus in customers)
            {
                cusNameList.Add(string.Format("{0} {1}" ,cus.ID ,cus.Name)) ;
            }
            //绑定
            this.comboBox1.DataSource = cusNameList ;

    如果为Customer重写ToString()方法,

        #region ToString 
        public override string ToString()
        {
            return this.ID.ToString() + " " + this.Name.ToString() ;
        }
        #endregion

    则只需要这样:

            string whereStr = string.Format("where {0} = '1'" ,Customer._IsValid) ;
            Customer[] customers = (Customer[])DataEntrance.GetObjects(typeof(Customer) ,whereStr) ;
            this.comboBox1.DataSource = customers ;

    这样就简便了好多,而且这样做还有一个好处,比如,从ComboBox从选取一个客户时,以前需要这样:

            string cusID = this.comboBox1.SelectedItem.ToString().Split(' ')[0] ;
            Customer desCus = null ;
            foreach(Customer cus in customers)
            {
                if(cus.ID = cusID)
                {
                    desCus = cus ;
                    break ;
                }
            }

    现在,简单多了,一行代码搞定:)

Customer desCus = this.comboBox1.SelectedItem as Customer ;

时间: 2024-09-20 09:02:47

Effective C# 精髓 (待续)的相关文章

《Effective C# 精髓》摘选

昨天买了一本<Effective C#>,看了几个Item,虽然没有当初读<Effective C++>时的那般震撼,但是也收获不少.把其中的要点记录于下,有些条款加上了自己的理解,权当作读书笔记吧 :-) Item 1: Always Use Properties Instead of Accessible Data Members 这个是地球人都知道的条款了.你需要记住,属性是类的外部接口部分,而(公共)成员却是内部实现.如果把内部实现暴露给外部,对于以后类的实现变更是非常不利

Effective C#教程

Effective C#原则1:尽可能的使用属性(property),而不是数据成员(field) Effective C#原则2:为你的常量选择readonly而不是const Effective C#原则3:选择is或者as操作符而不是做强制类型转换 Effective C#原则4:用条件属性而不是#if预编译块 Effective C#原则5:始终提供ToString() Effective C#原则6:区别值类型数据和引用类型数据 Effective C#原则7: 选择恒定的原子值类型数

obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]

    上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立.     我们这里模式的元素使用的是Car,其属性直接在Xcode中设置: 可以看到Car类型含有6中不同属性.接下来删除窗口中的文本控件,添加Array Controller控件,并将其Managed Object Context与File's Owner的managedObjectContext绑定.如下图: 将控制器的

Effective Java --&amp;amp;gt;(一)创建和销毁对象

创建|对象 Effective Java学习笔记JAVA语言支持四种基本类型:接口(Interface).类(Class).数组(Array).和原语类型(Primitive).前三种类型通常被称为引用类型(reference type),类的实例和数组是对象(object),而原语类型的值不是对象.一个类的成员(member)包括它的域(field),方法(method),成员类(member class)和成员接口(member interface).一个方法的原型(signature)包括

Access数据库的精髓所在

Access爱好者以会VBa为荣.我觉得这不是好现象.vba只是vb的子集,有着很多限制,比如不支持继承,不支持指针,不支持子界类型等.使用vba操作Office家族之外的数据结构是非常困难的. Access爱好者以会VBa为荣.我觉得这不是好现象.vba只是vb的子集,有着很多限制,比如不支持继承,不支持指针,不支持子界类型等.使用vba操作Office家族之外的数据结构是非常困难的. vba只是Access的一个特性.实际上没有vba微软也可以照旧大卖access.有了vba,只不过使acc

一个菜鸟站长的建站感受(待续)

自己建站的一点感受 算起来时间真是过得很快啊,一转眼就是2年多时间过去了,而我也是从一个对网站一窍不通的人到现在稍稍懂点网站知识,虽然自己还是一只超级菜鸟,但我还是想把我自己的建站过程中的一点体会与正在想建立网站或者是刚刚建立网站的朋友分享下,同时也希望高手们能多多指教. 下面我将分一下几个内容来进行介绍: 一.办站的初衷 二.程序的选择和学习: 三.本地调试的方法 四.空间问题: 五.安全设置 六.网站的推广 七.网站的生存 八.网站的维护 一.办站的初衷 这个也就是你建立网站的最初的想法,我

互联网江湖语录—厦门站长大会精髓

互联网江湖语录――厦门站长大会精髓 一.蔡文胜语录: l.中国互联网模式是最合适第三世界的 2.中国的互联网模式可以复制到越南等第三世界,如越南的互联网首页都是空白.电脑都没有插件,网吧什么软件都没有装,机会多多. 3.美国的互联网模式是基于高端与白领背景下的模式,所以美国的互联网模式在第三世界国家几乎没有成功的可能.中国的模式才最合适第3世界. 4.我接触了很多的广告主,我问他们到新浪投放一个广告成本大概是多少?他们知道每个点击将近有几十块的人民币.我告诉他,个人网站上面的点击成本大概只有一毛

触屏版网页交互设计:体现少即是多的设计精髓

文章描述:触屏版网页应用,实现移动场景用户需求.体现少即是多的设计精髓并表现主流的触屏界面气质,可算初步达标.在设计过程中需不断打磨细节,提升体验,令设计日臻完美. 触屏版网页应用,实现移动场景用户需求.体现少即是多的设计精髓并表现主流的触屏界面气质,可算初步达标.在设计过程中需不断打磨细节,提升体验,令设计日臻完美.下篇将结合案例讲述其中的故事.  >>提升体验的细节   让消息更随手  翻页大讨论  重要数字了然于胸  关于软键盘  大话横竖屏切换  让界面更"可触模"

mysql数据库优化(未完....待续....)

mysql|数据|数据库|优化 ########################################文件名:mysqloptimize,php                           ##主题: mysql数据库的优化                  ##作者: _Shakespeare(网络骑士)                    ##最后修改时间: 2002--09--20                      ##e-mail: shakespareshm