【C# 基础概念】表达式(expression)、语句(statement)、块(block),指令(using)
官方链接: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
语句使用以下替代语法:
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();
}
}
}
第二种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();
}
}
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);
}
【C# 基础概念】表达式(expression)、语句(statement)、块(block),指令(using)的更多相关文章
- Java基础教程(8)--表达式、语句和块
一.表达式 表达式由变量和运算符组成.下面是一个简单的赋值表达式: a = 0; 表达式都具有运算结果,因为赋值表达式的运算结果是左侧操作数的值,因此上面的表达式将会返回一个0.可以使用简单的 ...
- javascript语句——表达式语句、块语句、空语句和声明语句
× 目录 [1]表达式 [2]块语句 [3]空语句[4]声明 前面的话 如果表达式在javascript中是短语,那么语句(statement)就是javascript整句或命令.表达式计算出一个值, ...
- Java代码三级跳——表达式、语句和代码块
Java代码三级跳—表达式.语句和代码块 表达式(expression):Java中最基本的一个运算.比如一个加法运算表达式.1+2是一个表达式,a+b也是. 语句(statement):类似于平时说 ...
- 小猪猪C++笔记基础篇(五)表达式、语句
小猪猪C++笔记基础篇(五) 关键词:表达式.语句 本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题.先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还 ...
- JavaScript 中表达式和语句的区别
1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...
- C# - 表达式与语句
表达式与语句(Expression&Statement) 操作数(Operands) 1.数字.2.字符.3.变量.4.类型.5.对象.6.方法 操作符(Operator) 参考:C# - 操 ...
- 函数响应式编程(FRP)—基础概念篇
原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...
- C#表达式和语句
表达式由操作数 (operand) 和运算符 (operator) 构成.表达式的运算符指示对操作数适用什么样的运算.运算符的示例包括+.-.*./ 和 new.操作数的示例包括文本.字段.局部变量和 ...
- JavaScript--我发现,原来你是这样的JS(基础概念--躯壳,不妨从中文角度看js)
介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第二篇(基础概念--躯壳篇),有着部分第三章的知识内容,当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的, ...
随机推荐
- gin中使用路由组
package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() / ...
- 服务器+nextcloud搭建自己的私有云盘
简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本控制.团队协作等功能.它的客户端覆盖了Wind ...
- uni微信小程序优化,多个分包在用的公共代码该放在哪?
公共的代码包括公用的vue组件和js代码,从维护性的角度来说应该放到主包才对, 但是主包有大小限制,如果把2个分包都在用的代码放到主包里面那2M很快就满了. 所以该放在哪?我的方案是从维护的角度放在主 ...
- js trim()方法
从字符串中移除前导空格.尾随空格和行终止符. 语法 stringObj.trim() 参数 stringObj 必选.String 对象或字符串.trim 方法不修改该字符串. 返回值 已移除前导空格 ...
- 定制博客CSS样式
首先你需要添加页面CSS代码
- CABasicAnimation动画
使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...
- iOS开发笔记,简单实现视频音频的边下边播
总是在网上看别人的博文,受益匪浅,从没自己写过,今天分享一点小经验,第一次写技术博客,希望对同行的ios猿们有所帮助. 先介绍一下自己的情况:一年ios开发,http协议不太懂,大约知道断点下载h ...
- 阅读mybatis的源码的思路
■ 阅读源码mybatis操作数据库的过程: /* 测试查询 */ @Test public void testGet() throws IOException { // 1.从classpath路径 ...
- MySQL基本数据类型与约束条件
昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...
- 我们一起来学Shell - shell的并发及并发控制
文章目录 bash的并发 未使用并发的脚本 简单修改 使用wait命令 控制并发进程的数量 文件描述符 查看当前进程打开的文件 自定义当前进程用描述符号操作文件 管道 我们一起来学Shell - 初识 ...