C#图解教程读书笔记(四 预处理、反射、特性、C#6.0,7.0新内容)


提要,此文章并不会记录过于基础的东西,只会记录个人认为比较重要的概念以及实用的代码,如果您是新手强烈建议阅读实体书,自己一步一步敲一遍


第二十二章 命名空间和程序集

  • using 别名 usign Sys = System;
  • using static 引用指定命名空间中特定的类,从而使用其静态成员
  • 程序集的构成 在第一章.Net中就讲过了主要的是CIL通过JIT动态编译使用的东西、程序集中类型的元数据、引用其他程序集列表等等。

第二十三章 异常

第二十四章 预处理指令

  • 概念 指示编译器如何处理源代码
  • #define 必须在C#代码前
  • #line 行号指令

第二十五章 反射和特性

  • 什么叫做反射? 第一章和第二十二章讲了程序集,知道程序集中包含所有类型的元数据(meta数据)。元数据是对程序以及类型的描述。而反射就是程序在运行时查看元数据
  • 特性是什么? 是一种允许我们向程序集添加元数据的语言结构。目的:告诉编译器将某组元数据嵌入程序集
  • Conditional 将会忽略方法中的所有调用,下面是使用,注释了将不会显示XXX
  • 调用者信息特性 CallerFilePath、CallerLineNumber、CallerMemberName。用于方法的参数。
  • 调试特性 在进行调试时,使用DebugStepThrough将不会进入某些地方。适用于类、结构体、构造方法、访问器、方法。
  • 全局特性 [assembly:特效类名] 放在命名空间外。常放在AssemblyInfo.cs中,用于公司、产品版权信息等
  • 自定义特性 自定义特性只需要继承System.Attribute。自定义特性类也是类,依然可以使用相关特性修饰。AttributeUsage
  • 使用特性类
  1. 是否使用了某特性 type.IsDefined(AttType, 是否搜索类的继承树)
  2. 获得使用的特性 type.GetCustomAttributes返回object[], 需要转换

第二十六章 C#6.0和C#7.0新增内容

  1. 字符串插值 $"数值为:{value}"
  2. 自动属性初始化 public int Count{get;set;} = 20
  3. 属性表达式 public int Count=>personCount + 2
  4. 空条件运算符 someObj?.Method() someObj不为空则执行Method函数
  5. 异常过滤器 catch(Exception ex) when (ex.Message.Contains("404"))
  6. 值元组 ValueTuple结构体
        static void Main(string[] args)
        {

            var c = GetStrAndInt();
            Console.WriteLine(c.str);
            Console.WriteLine(c.i);
            Console.ReadLine();
        }

        public static (string str, int i) GetStrAndInt()
        {
            return ("str", 1);
        }
  1. 匹配变量 如果d is BaseClass通过 BaseClass类型变量bc就可以直接使用
            DClass d = new DClass();

            if(d is BaseClass bc)
            {

            }
  1. 数字分隔符 例如int i = 10_0000; 并不会影响。1、_不能放在第一或者最后一位上 2、不能放在小数点、类型指示符(float的f)前或者后
  2. ValueTask

第二十六章 其他东西

  • Parse 当字符串转int、float等,会使用int.Parse这样的函数。这里有个问题Parse如果转不成那么会抛出一个异常,所以可以考虑使用TryParse
            string fs = "1.234f";
            bool isSucc = float.TryParse(fs, out float res);
            if (isSucc)
            {
                Console.WriteLine(res);
            }
            else
            {
                Console.WriteLine("Parse failed");
            }
  • 析构函数 析构函数在对象从托管堆移除某一时刻调用,你并不知道什么时候调用。所以代码中包含非托管资源应该越早释放越好,所以使用析构函数来释放就很不好,所以使用了Dispose
  • 析构函数与Dispose调用规则
    class MyClass : IDisposable
    {
        bool disposed = false;
        public void Dispose()
        {
            Dispose(true);
            // 告诉CLR不要调用这个对象的析构函数
            GC.SuppressFinalize(this);
        }

        ~MyClass()
        {
            Dispose(false);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                }
                else
                {
                    // 释放非托管资源
                }
                disposed = true;
            }
        }
    }

至此C#图解这本书看完了。部分章节如Linq用的比较少就没有记录,还有一些基础的章节也没有记录。有需要的自己去看原书就可以了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值