C#教程 - 语句与表达式(Statements & Expression)
更新记录
转载请注明出处。
2022年9月12日 发布。
2022年9月10日 从笔记迁移到博客。
语句与表达式(Statements & Expression)说明
语句是一段可执行代码,不一定返回值
C#中使用;号分句,代码块{}视为语句
有;的代码不一定是语句,比如using
顶级语句(C#9.0)
1、直接在C#文件中直接编写入口方法的代码,不用类,不用Main.经典写法仍然支持。
2、同一个项目中只能有一个文件具有顶级语句。
3、顶级语句中可以直接使用await语法,也可以声明函数
表达式说明
表达式(Expression)是总有返回值的代码,所以它可写在赋值语句等号的右侧
表达式 = 操作符+操作数
代码块说明
使用{}大括号将多个语句组成代码块
规范:在控制流语句中除非只有一条语句,不然都用代码块
语句类型
控制流程语句(Flow Control Statement)
选择流程
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;
}
if语句匹配模式
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");
}
循环流程(Iteration Statements)
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
switch表达式(Switch expressions (C# 8))
实例:
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语句(using statement)
说明
某些类型实例有 非托管内容代码 或 非常消耗资源的代码
在代码使用完后为了尽快释放内存,可以使用using语句自动释放
资源是指实现了System.IDisposable接口的类或结构,该接口包含一个Dispose方法
注意:这里的using语句并不是using指令,只是符号相同
资源使用过程
分配资源
使用资源
销毁资源
使用using语句
在圆括号内分配资源
在大括号内使用资源,GC会自动管理资源
using(资源分配,资源分配,资源分配,....)
{
//使用资源
}
using语句本质:
using本质是一种语法糖
在try内分配、使用资源
在finally内自动调用资源的Dispose方法释放资源
注意:
using语句中分配的对象必须可以隐式转换为IDisposable
即必须实现IDisposable接口
try
{
//资源分配使用
}
catch(exception e)
{
//处理错误
}
finally
{
//释放资源
}
提示:可以一次性分配多个相同类型的资源
提示:using语句还可以进行嵌套
using语句另一种形式
注意:这种形式资源被释放会被释放,但没法解决引用还存在的问题
本质:
USING声明using declarations)(C#8)
省略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声明的资源会被自动释放。
全局USING 指令(C#10)
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和委托的关系和区别
Expression对象储存了运算逻辑,它把运算逻辑保存成抽象语法树(AST)可以在运行时动态获取运算逻辑。而普通委托则没有。
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16678356.html