• Effective C# 读书笔记(一):C#语言元素


     

    1、使用属性代替可访问的数据成员

    只要打算将数据暴露在类型的公有接口或受保护的接口中,我们都应该使用属性来实现。对于具有序列或者字典特征的类型,则应该采用索引器。所有数据成员都应一律声明为私有。使用属性的好处显而易见:我们可以得到更好的数据绑定支持,我们可以更容易地在将来对其访问方法的实现做任何改变。将变量封装在属性中只不过增加几行代码。如果刚开始使用数据成员,后来又发现需要使用属性,这时再来修改的成本将是几个小时。今天投入一点,会为明天节省许多时间。

    JIT编译器会对某些方法调用(包括属性访问器)进行内联处理,属性和数据成员的效率没有任何差别。及时属性访问器没有被内联,实际的效率差别相对于函数调用的成本来讲也是可以忽略不计的。只有在很少的情况下,这种差别才值得我们注意。

    2、运行时常量(readonly)优于编译时常量(const

    c#中,我们用readonly关键字声明运行时常量,用const关键字来声明编译时常量。

    编译时常量在编译后的结果代码中会被替换为该常量的值。运行时常量在运行时被计算,编译后代码将维持对readonly变量(而非它的值)的引用。

    编译时常量只可用于值类型,运行时常量则没有限制。

    使用const较之于使用readonly的唯一好处就是性能:使用已知常量值得代码效率要比访问readonly值的代码效率稍好一点,但是其中的效率提升是非常小的。

    只有当某些情况要求变量的值必须在编译时可用,才应该考虑使用const,例如:特性(attribute)类的参数,枚举定义,以及某些不随组件版本变化而变化的值。否则,对于其他任何情况,都应该优先选择readonly常量,从而获得其所具有的灵活性。

    3、操作符isas优于强制转型

    好的面向对象实践对告诫我们避免转型,但有时候我们别无选择。不能避免转型时,我们应该尽量使用asis操作符来清晰的表达意图。

    当我们要立即进行转型时,我们应使用as操作符。如果仅仅是进行类型的判断而不需要立即进行转型,使用is即可。

    4、使用Conditional特性代替#if条件编译

    使用Conditional特性比使用#if/#endif产生的IL代码更有效。同时,将其限制在函数层次上可以清晰的讲条件行代码分离出来,从而使我们的代码具有更好的机构。另外,C#编译器也为此提供了很好的支持,从而帮助我们避免以前使用#if#endif时犯的错误。

    5、总是提供ToString()方法

    System.Object默认提供的ToString()方法会返回类型的名称。我们可以简单的重写ToString()方法,来满足我们的要求。也可以提供重载的ToString()方法,使用格式字符串来为我们的类型指定自己的格式,满足更复杂的需求。

    6、优先采用foreach循环语句

    foreach是一个非常有用的语句,它会使用最高效的构造为“数组的上下界索引”、“多维数组遍历”和“操作数转型”产生正确的代码,并且产生的是最具效率的循环结构。它是遍历集合的最佳方式。

    任何集合类型都可以使用foreach。有3种方法可以使一个类支持foreach方法:

    1)类型具备一个公有的GetEnumerator()方法;

    2)类型显示实现了IEnumerable接口;

    3)类型实现了IEnumerator接口。

  • 相关阅读:
    学习笔记datatablexml转换
    立即执行函数
    MySQL基操—1.Linux下安装(CentOS6/7yum、rpm、tar)
    Linux1.11.shell(环境变量配置文件)
    三国HR评估报告
    毕业5年后拉开差距的原因
    职业的选择
    WPF图片的缩放节省内存
    .asmx支持post请求或者get请求调用
    ionic3遇到的刷新页面服务器关闭的问题
  • 原文地址:https://www.cnblogs.com/glacierh/p/1547060.html
Copyright © 2020-2023  润新知