提要,此文章并不会记录过于基础的东西,只会记录个人认为比较重要的概念以及实用的代码,如果您是新手强烈建议阅读实体书,自己一步一步敲一遍
第二十二章 命名空间和程序集
using 别名
usign Sys = System;using static
引用指定命名空间中特定的类,从而使用其静态成员程序集的构成
在第一章.Net中就讲过了主要的是CIL通过JIT动态编译使用的东西、程序集中类型的元数据、引用其他程序集列表等等。
第二十三章 异常
第二十四章 预处理指令
概念
指示编译器如何处理源代码#define
必须在C#代码前#line
行号指令
第二十五章 反射和特性
什么叫做反射?
第一章和第二十二章讲了程序集,知道程序集中包含所有类型的元数据(meta数据)。元数据是对程序以及类型的描述
。而反射就是程序在运行时查看元数据
。特性是什么?
是一种允许我们向程序集添加元数据的语言结构。目的:
告诉编译器将某组元数据嵌入程序集Conditional
将会忽略方法中的所有调用,下面是使用,注释了将不会显示XXX
![](https://i-blog.csdnimg.cn/blog_migrate/de318943762be034e6872217650bb1b6.png)
调用者信息特性
CallerFilePath、CallerLineNumber、CallerMemberName。用于方法的参数。调试特性
在进行调试时,使用DebugStepThrough将不会进入某些地方。适用于类、结构体、构造方法、访问器、方法。全局特性
[assembly:特效类名] 放在命名空间外。常放在AssemblyInfo.cs中,用于公司、产品版权信息等自定义特性
自定义特性只需要继承System.Attribute。自定义特性类也是类,依然可以使用相关特性修饰。AttributeUsage
![](https://i-blog.csdnimg.cn/blog_migrate/c37fa1ef589d9acd67ae084427a130aa.png)
使用特性类
是否使用了某特性
type.IsDefined(AttType, 是否搜索类的继承树)获得使用的特性
type.GetCustomAttributes返回object[], 需要转换
第二十六章 C#6.0和C#7.0新增内容
字符串插值
$"数值为:{value}"
自动属性初始化
public int Count{get;set;} = 20
属性表达式
public int Count=>personCount + 2
空条件运算符
someObj?.Method()
someObj不为空则执行Method函数异常过滤器
catch(Exception ex) when (ex.Message.Contains("404"))
值元组
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);
}
匹配变量
如果d is BaseClass
通过 BaseClass类型变量bc就可以直接使用
DClass d = new DClass();
if(d is BaseClass bc)
{
}
数字分隔符
例如int i = 10_0000;
并不会影响。1、_
不能放在第一或者最后一位上 2、不能放在小数点、类型指示符(float的f)前或者后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);
GC.SuppressFinalize(this);
}
~MyClass()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
{
if (disposing)
{
}
else
{
}
disposed = true;
}
}
}
至此C#图解这本书看完了。部分章节如Linq用的比较少就没有记录,还有一些基础的章节也没有记录。有需要的自己去看原书就可以了