官方链接:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/
以下内容是网上找的,结合官方内容写出的
C#中表达式(Expression)的定义
An expression is a sequence of one or more operands and zero or moreoperators that can be evaluated to a single value, object, method, ornamespace. Expressions can consist of a literal value, a method
invocation, an operator and its operands, or a simple name. Simple
names can be the name of a variable, type member, method parameter,namespace or type.
任何能得到值的运算就是表达式。表达式经过运算之后能够产生一个值而这个值又具有自己的数据类型,所以说我们也把表达式所产生的值(很多情况下与操作符有关系)的数据类型称为这个表达式的数据类型。例如:这有一个布尔类型的表达式
最简单的 C# 表达式是文本(例如整数和实数)和变量名称。可以使用运算符将它们组合成复杂的表达式。----msdn
任何表达式都有值和类型两个基本属性。
C#中的表达式
C#中的表达式主要包括以下几种:
常量表达式:例如: 1、2、3、
200 + 3
等常量
算术表达式:用算术运算符连接,结果是数值类型 例如:b-2
关系表达式:用关系运算符连接,结果是布尔类型 例如: i>5
逻辑表达式:用逻辑运算符连接,结果是布尔类型 例如:i||j
赋值表达式:用赋值运算符连接,运算结果的类型取决于赋值运算符左侧的运算结果。i=5
函数(方法)调用表达式:函数也称方法,是可以完成特定功能的程序单位,通过函数调用表达式可以执行函数的特定功能,运算的结果类型取决于函数的返回值类型。 fun() 要有返回值lambda 表达式:b=>x+1;
正则表达:Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
switch 表达式
is 表达式
按运算符分对应一元运算符和二元运算符:
UnaryExpression; 一元运算表达式 如- - i BinaryExpression; 二元运算表达式 x>5、x+y
C#语言对语句(Statement)的定义:
. The actions that a program takes are expressed in statements. Common actions include
declaring variables, assigning valuE, calling methods, looping through collections, andbranching to one or another block of code, depending on a given condition. The order inwhich statements are executed in a program is called the flow of control or flow of execution.The flow of control may vary every time that a program is run, depending on how the
program reacts to input that it receives at run time.
C#语言的语句除了能够让程序员"顺序地"(sequentially)表达算法思想,还能通过条件判断、跳转和循环等方法控制程序逻辑的走向
1、简言之就是:陈述算法思想,控制逻辑走向,完成有意义的动作(action).
2、C#语言的语句由分号(;)结尾,但由分号结尾的不一定都是语句 比如 :using System;这是引入名称空间的指令,不是语句。
程序执行的操作采用语句表达。 常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。 语句在程序中的执行顺序称为“控制流”或“执行流”。 根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同。
语句可以是以分号(;)结尾的单行代码,也可以是语句块中的一系列单行语句。 语句块括在括号 {} 中,并且可以包含嵌套块。
声明语句 | 声明语句引入新的变量或常量。 变量声明可以选择为变量赋值。 在常量声明中必须赋值。 |
表达式语句 | 用于计算值的表达式语句必须在变量中存储该值。 |
选择语句 | 选择语句用于根据一个或多个指定条件分支到不同的代码段。 有关详细信息,请参阅下列主题: |
迭代语句 | 迭代语句用于遍历集合(如数组),或重复执行同一组语句直到满足指定的条件。 有关详细信息,请参阅下列主题: |
跳转语句 | 跳转语句将控制转移给另一代码段。 有关详细信息,请参阅下列主题: |
异常处理语句 | 异常处理语句用于从运行时发生的异常情况正常恢复。 有关详细信息,请参阅下列主题: |
Checked 和 unchecked | Checked 和 unchecked 语句用于指定将结果存储在变量中、但该变量过小而不能容纳结果值时,是否允许数值运算导致溢出。 有关详细信息,请参阅 checked 和 unchecked。 |
await 语句 |
如果用 async 修饰符标记方法,则可以使用该方法中的 await 运算符。 在控制到达异步方法的 await 表达式时,控制将返回到调用方,该方法中的进程将挂起,直到等待的任务完成为止。 任务完成后,可以在方法中恢复执行。有关简单示例,请参阅方法的“异步方法”一节。 有关详细信息,请参阅 async 和 await 的异步编程。 |
yield return 语句 |
迭代器对集合执行自定义迭代,如列表或数组。 迭代器使用 yield return 语句返回元素,每次返回一个。 到达 yield return 语句时,会记住当前在代码中的位置。 下次调用迭代器时,将从该位置重新开始执行。有关更多信息,请参见 迭代器。 |
fixed 语句 |
fixed 语句禁止垃圾回收器重定位可移动的变量。 有关详细信息,请参阅 fixed。 |
lock 语句 |
lock 语句用于限制一次仅允许一个线程访问代码块。 有关详细信息,请参阅 lock。 |
带标签的语句 | 可以为语句指定一个标签,然后使用 goto 关键字跳转到该带标签的语句。 (参见下一行中的示例。) |
空语句 | 空语句只含一个分号。 不执行任何操作,可以在需要语句但不需要执行任何操作的地方使用。 |
C# 语句块(block)
4.3.2使用块来分组语句
有时,需要在一个布尔表达式为true的前提下运行两个或者更多的语句。可以将要运行的语句分组到一个新方法中,然后调用那个方法。但是,一个更简单的做法是将语句分组到一个块(block)中。块是指用一对大括号来封闭的一系列语句。在下例中,两个语句将seconds变量重置为零,并使minutes变量递增。我们用一个块来分组这两个语句。假如seconds 的值等于59,就执行该块:
int seconds =0;
int minutes =0;if 《seconds ==59)(
seconds =0:minuteB早+:
}else
seconds++;
C# 指令
1、using指令
using指令
用于导入命名空间。这是避免使用完全限定名称来指代某种类型的快捷方法。
using static指令
从C#6开始,我们不仅可以导入命名空间还可以使用using static指令导入特定的类型。这样就可以直接使用类型静态成员而不需要指定类型的名称了。在接下来的例子中,我们这样调用Console类的静态方法WriteLine:
using static指令将类型的可访问的静态成员,包括字段、属性以及嵌套类型(后续章节会讲解),全部导入进来。同时,该指令也支持导入枚举类型的成员
因此如果导入了以下的枚举类型:
using static System.Windows.Visibility;
我们就可以直接使用Hidden而不是Visibility.Hidden了:
var textBox = new TextBox { Visibility = Hidden };
C#编译器还没有聪明到可以基于上下文来推断出正确的类型,因此在导入多个静态类型导致二义性时会发生编译错误。
using语句
第一种using语句写法:这种写法默认sw的作用在第一层花括号之间。从 C# 8.0 开始,可以对不需要使用大括号的 using
语句使用以下替代语法:
该Dispose()
方法将依次调用该Close()
方法,所以使用using不用特有关connection闭数据链接。
SqlConnection如果超出范围,则不会关闭。 因此,必须通过调用 Close
或 Dispose
显式关闭连接。 Close
并且 Dispose
具有功能等效性
if (!readme.Exists)
{
using StreamWriter sw = readme.CreateText();
sw.WriteLine("this is i write first line");
sw.WriteLine("this is i write scond line");
sw.WriteLine("this is i write third line");
}
ILspy反编译后
if (!readme.Exists)
{
StreamWriter sw = readme.CreateText();
try
{
sw.WriteLine("this is i write first line");
sw.WriteLine("this is i write scond line");
sw.WriteLine("this is i write third line");
}
finally
{
if (sw != null)
{
((IDisposable)sw).Dispose();//该Dispose()
方法将依次调用该Close()
方法
}
}
}
扩展
public bool AuthenticateUser(NetworkCredential credential) { bool validauer; using (var connection = Getconntion()) using(var command=new SqlCommand()) { connection.Open(); command.Connection = connection; command.CommandText = "select * from [userinfo] where username=@username and password=@password"; command.Parameters.Add("@username", SqlDbType.VarChar); command.Parameters["@username"].Value = credential.UserName; // command.Parameters.Add("@username", SqlDbType.VarChar).Value = credential.UserName; command.Parameters.Add("@password", SqlDbType.VarChar).Value = credential.Password; validauer = command.ExecuteScalar() == null ? false:true; } return validauer; }
反编译后
public class UserRepository : Login.Repositories.RepositoryBase, Login.Models.IUserRepository { public void Add(Login.Models.UserMode mode) { throw new System.NotImplementedException(); } public bool AuthenticateUser(System.Net.NetworkCredential credential) { Microsoft.Data.SqlClient.SqlConnection connection = Getconntion(); try { Microsoft.Data.SqlClient.SqlCommand command = new Microsoft.Data.SqlClient.SqlCommand(); try { connection.Open(); command.Connection = connection; command.CommandText = "select * from [userinfo] where username=@username and password=@password"; command.Parameters.Add("@username", System.Data.SqlDbType.VarChar); command.Parameters["@username"].Value = credential.UserName; command.Parameters.Add("@password", System.Data.SqlDbType.VarChar).Value = credential.Password; return command.ExecuteScalar() != null; } finally { if (command != null) { ((System.IDisposable)command).Dispose(); } } } finally { if (connection != null) { ((System.IDisposable)connection).Dispose(); } } }
第二种using语句写法,给using语句加一个额外的花括号{},花括号标识作用域
if (!readme.Exists)
{
{
using StreamWriter sw = readme.CreateText();
sw.WriteLine("this is i write first line");
sw.WriteLine("this is i write scond line");
sw.WriteLine("this is i write third line");
}
int i = 0;
}
Il编译后的代码
if (!readme.Exists)
{
StreamWriter sw = readme.CreateText();
try
{
sw.WriteLine("this is i write first line");
sw.WriteLine("this is i write scond line");
sw.WriteLine("this is i write third line");
}
finally
{
if (sw != null)
{
((IDisposable)sw).Dispose();//该Dispose()
方法将依次调用该Close()
方法
}
}
int i = 0;
}
第三种写法、这种事比较好方式,用完sw就释放 。using 语句中使用的对象必须实现 IDisposable 接口。
var reader = new StringReader(manyLines); using (reader) { string? item; do { item = reader.ReadLine(); Console.WriteLine(item); } while (item != null); }
第四种写法:C#8.0 之前的写法
using (var reader = new StringReader(manyLines)) { string? item; do { item = reader.ReadLine(); Console.WriteLine(item); } while (item != null); }