重庆熊猫 Loading

C#教程 - 语句与表达式(Statements & Expression)

更新记录
转载请注明出处。
2022年9月12日 发布。
2022年9月10日 从笔记迁移到博客。

语句与表达式(Statements & Expression)说明

语句是一段可执行代码,不一定返回值

C#中使用;号分句,代码块{}视为语句

有;的代码不一定是语句,比如using

顶级语句(C#9.0)

1、直接在C#文件中直接编写入口方法的代码,不用类,不用Main.经典写法仍然支持。

2、同一个项目中只能有一个文件具有顶级语句。

3、顶级语句中可以直接使用await语法,也可以声明函数

表达式说明

表达式(Expression)是总有返回值的代码,所以它可写在赋值语句等号的右侧

表达式 = 操作符+操作数

代码块说明

使用{}大括号将多个语句组成代码块

规范:在控制流语句中除非只有一条语句,不然都用代码块

语句类型

image

控制流程语句(Flow Control Statement)

选择流程

if                      //1选1
if else                 //2选1
if else if else if else //多选1,可以是范围或定值
switch                  //多选1,定值

图示

if结构
image

if..else..结构
image

if..else if..else结构
image

switch结构:
image

新版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结构
image

do..while结构
image

for结构

for (init-clause; condition-clause; iteration-clause)
  statement-or-statement-block

image

跳出流程

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指令,只是符号相同

资源使用过程

分配资源

使用资源

销毁资源
image

使用using语句

在圆括号内分配资源

在大括号内使用资源,GC会自动管理资源

using(资源分配,资源分配,资源分配,....)
{
    //使用资源
}

using语句本质:

​ using本质是一种语法糖

​ 在try内分配、使用资源

​ 在finally内自动调用资源的Dispose方法释放资源

注意:

using语句中分配的对象必须可以隐式转换为IDisposable

即必须实现IDisposable接口
image

try
{
    //资源分配使用
}
catch(exception e)
{
    //处理错误
}
finally
{
    //释放资源
}

提示:可以一次性分配多个相同类型的资源
image

提示:using语句还可以进行嵌套
image

using语句另一种形式

注意:这种形式资源被释放会被释放,但没法解决引用还存在的问题
image

本质:
image

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)可以在运行时动态获取运算逻辑。而普通委托则没有。

posted @ 2022-09-12 08:16  重庆熊猫  阅读(209)  评论(0编辑  收藏  举报