• C#高效编程 读书笔记(1)


    读了《C#高效编程--改进C#代码的50个行之有效的办法》,在此将书中的编程建议做简单记录。我读的这本的书的第二版,是基于.NET4.0的。

    第1章 C#语言习惯
    条目1 使用属性(Property)而不是可访问的数据成员

    1. 只有属性才能应用数据绑定功能
    2. 属性使用方法实现,可以进行数据验证,多线程支持
    3. 属性可以定义为抽象的,比如用在接口中,
        public interface INameValuePair<T>
        {
            string Name
            {
                get;
            }
    
            T Value
            {
                get;
                set;
            }
        }
    1. 属性可以为读写行为定义不同访问级别。
    2. 通过索引器属性来暴露可索引的类项目


    条目2 用运行时常量(readonly)而不是编译期常量(const)

    1. const常量在编译时替换,readonly常量在运行时求值
    2. const常量只能是基本类型(整数,浮点数),枚举及字符串,readonly常量可以是任何类型,在构造函数中对其进行初始化
    3. 对于跨程序集引用的常量,readonly常量是被引用为一个变量,而const变量被引用的是一个值,如果局部的更新常量所在程序集,那么其它程序集如果引用了const常量,则需要重新编译才能反应出其值的变化,而readonly常量则不需要。


    条目3 推荐使用is或as操作符而不是强制类型转换

       可以避免转型失败的异常处理,方便的进行类型的检查与转换


    条目4 使用Conditional特性而不是#if条件编译

    1. #if定义的代码在指定条件不成立的情况下依然会被编译到程序集中,而Conditional特性不会
    2. Conditional特性应用在方法层面,被应用的方法不能有返回值,同时最好也没有参数,如果指定的条件不成立,那么对于参数进行改的变的操作没有进行,可以引起难以调试的Bug
    3. 多个编译条件或的关系可用Conditional特性,而与的关系只能用#if的方式


    条目5 为类型提供ToString()方法

    以可读的方式输出类的主要信息,也可通过实现IFormattable接口等方法,以格式化的方法输出类的主要内容。


    条目6 理解几个等同性判断之间的关系
    条目7 理解GetHashCode()的陷阱
    条目8 推荐使用查询语法而不是循环
    条目9 避免在API中使用转换操作符
    条目10 使用可选参数减少方法重载的数量
    条目11 理解短小方法的优势

    很多编程规范中都从代码的可读性,易维护性的角度提出过方法应简短的建议,在.NET程序中,CLR调用JIT按函数粒度逐一将IL翻译成机器码,没有被调用的方法不会被JIT调用,这样可以提高程序启动速度。


    第2章 .NET资源管理
    条目12 推荐使用成员初始化器而不是赋值语句
    条目13 正确地初始化静态成员变量
    条目14 尽量减少重复的初始化逻辑
    条目15 使用using和try/finally清理资源
    条目16 避免创建非必要的对象

    1. 如果局部变量使用频率较高,应该将其提升为成员变量,减少频繁创建和销毁的开销。
    2. 提供一个类存放某个常用实例对象,如果GDI+中常用画刷的实现模式
    3. 大量的拼接字符串操作应用StringBuilder类


    条目17 实现标准的销毁模式

    1. 微软定义的可处置对象的处置模式
       public class MyResourceWrapper : IDisposable{
            private bool disposed = false;
    
            protected virtual void Dispose(bool disposing)
            {
                //用true表示对象用户触发了清理过程
                CleanUp(true);
                //跳过终结(析构)
                GC.SuppressFinalize(this);
            }
    
            private void CleanUp(bool disposing)
            {
                //防止重复清理
                if (!this.disposed)
                {
                    if (disposing)
                    {
                        //释放托管资源
                    }
                    //释放非托管资源
                }
                disposed = true;
            }
    
            /// <summary>
            /// 没有显示调用Dispose()时,GC会调用终结函数清理非托管资源
            /// </summary>
            ~MyResourceWrapper()
            {
                CleanUp(false);
            }
        }

    条目18 区分值类型和引用类型
    1. 结构用来存放数据,类用来定义行为
    2. 一个元素的值类型,初始化空间时只需要要一次操作,而引用类型需要101次,首先是引用所占空间,然后是每个元素的初始化
    3. 判断是否应用结构的标准:1)类型的主要职责是存储数据;2)类型所有公有接口都是由访问其数据成员的属性定义的吗?3)该类型永远不会有派生类?4)该类型永远不需要支持多态?

    条目19 保证0为值类型的有效状态
    条目20 保证值类型的常量性和原子性
  • 相关阅读:
    webNav
    keyBoardValue
    认证,权限,频率
    路由组件与视图集中附加action的声明
    视图组件
    请求与响应
    DRF序列化组件
    DRF入门及安装
    后台管理
    auth认证模块
  • 原文地址:https://www.cnblogs.com/SharpDeveloper/p/2137628.html
Copyright © 2020-2023  润新知