更新记录
转载请注明出处。
2022年9月12日 发布。
2022年9月10日 从笔记迁移到博客。
语句是一段可执行代码,不一定返回值
C#中使用;号分句,代码块{}视为语句
有;的代码不一定是语句,比如using
1、直接在C#文件中直接编写入口方法的代码,不用类,不用Main.经典写法仍然支持。
2、同一个项目中只能有一个文件具有顶级语句。
3、顶级语句中可以直接使用await语法,也可以声明函数
表达式(Expression)是总有返回值的代码,所以它可写在赋值语句等号的右侧
表达式 = 操作符+操作数
使用{}大括号将多个语句组成代码块
规范:在控制流语句中除非只有一条语句,不然都用代码块
if //1选1 if else //2选1 if else if else if else //多选1,可以是范围或定值 switch //多选1,定值
if结构
if..else..结构
if..else if..else结构
switch结构:
新版switch支持类型匹配和条件筛选(C#7.0):
switch (data) { case decimal decimalValue: total += decimalValue; break; case int intValue when intValue > 50: total += intValue; break; }
C# 7.0起if支持匹配模式,支持将类型进行转换并赋值
//object o = "3"; //将执行else object o = 3; //可以转换 //检测o是否可以转为int类型 if (o is int i) { Console.WriteLine(++i); //4 } else { Console.WriteLine("Can't Convert"); }
for //条件确定,增量确定 foreach
注意:
必须实现了可枚举方法才可以使用foreach
foreach中不可以增加删除集合元素
while //条件不确定,增量确定 do while //至少执行一次
while结构
do..while结构
for结构
for (init-clause; condition-clause; iteration-clause) statement-or-statement-block
break
continue
return
实例:
string cardName = cardNumber switch { 13 => "King", 12 => "Queen", 11 => "Jack", _ => "Pip card" // equivalent to 'default' };
还可以使用多个变量来进行匹配
注意:本质是tuples类型
int cardNumber = 12; string suite = "spades"; string cardName = (cardNumber, suite) switch { (13, "spades") => "King of spades", (13, "clubs") => "King of clubs", ... };
某些类型实例有 非托管内容代码 或 非常消耗资源的代码
在代码使用完后为了尽快释放内存,可以使用using语句自动释放
资源是指实现了System.IDisposable接口的类或结构,该接口包含一个Dispose方法
注意:这里的using语句并不是using指令,只是符号相同
分配资源
使用资源
销毁资源
在圆括号内分配资源
在大括号内使用资源,GC会自动管理资源
using(资源分配,资源分配,资源分配,....) { //使用资源 }
using语句本质:
using本质是一种语法糖
在try内分配、使用资源
在finally内自动调用资源的Dispose方法释放资源
注意:
using语句中分配的对象必须可以隐式转换为IDisposable
即必须实现IDisposable接口
try { //资源分配使用 } catch(exception e) { //处理错误 } finally { //释放资源 }
提示:可以一次性分配多个相同类型的资源
提示:using语句还可以进行嵌套
注意:这种形式资源被释放会被释放,但没法解决引用还存在的问题
本质:
省略using声明的()和{}即可变为using定义
注意:从C# 8开始可用
在实现了ldisposable/IAsyncDisposable接口的类型的变量声明前加上using,当代码执行离开变量的作用域时,对象就会被释放。
using Sq|Connection conn = new SqlConnection("Data Source=.;Initial Catalog=db1;Integrated Security=True"); using SqlCommand cmd = conn.CreateCommand();
实例:
using var reader = File.OpenText ("file.txt");
实例:
using FileStream fs = new FileStream ("myFile.txt", FileMode.Open);
实例:
if (File.Exists ("file.txt")) { using var reader = File.OpenText ("file.txt"); Console.WriteLine (reader.ReadLine()); ... }
在if语句完成后,using声明的资源会被自动释放。
1、将 global 修饰符添加到 using 前,这个命名空间就应用到整个项目,不用重复using.
2、通常创建一个专门用来编写全局using代码的C#文件。
3、如果csproj中启用了<ImplicitUsings>enable</ImplicitUsings>
,编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样。
表达式树(Expression Tree):树形数据结构表示代码,以表示逻辑运算,以便可以在运行时访问逻辑运算的结构。
使用Expression<TDelegate>
类型。
实例:从Lambda表达式来生成表达式树
Expression<Func<Book, bool>> e1 = b =>b.Price > 5;
Expression对象储存了运算逻辑,它把运算逻辑保存成抽象语法树(AST)可以在运行时动态获取运算逻辑。而普通委托则没有。