【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版)的读书笔记第二篇(基础概念--躯壳篇),有着部分第三章的知识内容,当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的, ...
随机推荐
- 领域驱动设计-CQRS
CQRS 代表命令查询职责分离.这是我第一次听到Greg Young描述的模式.其核心概念是,您可以使用与用于读取信息的模型不同的模型来更新信息.在某些情况下,这种分离可能很有价值,但请注意,对于大多 ...
- golang中锁
一.什么场景下需要用到锁当程序中就一个线程的时候,是不需要加锁的,但是通常实际的代码不会只是单线程,有可能是多个线程同时访问公共资源,所以这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? ...
- python 爬虫爬取历年双色球开奖信息
目前写的这些爬虫都是些静态网页,对于一些高级网页(像经过JS渲染过的页面),目前技术并不能解决,自己也是在慢慢学习过程中,如有错误,欢迎指正: 对面前端知识本人并不懂,过程中如果涉及到前端知识,也是百 ...
- ZooKeeper 授权访问
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- Javascript之递归求裴波那契数
一.遍历的方式性能更加,递归的方式代码利于阅读.简短,性能略差 二.裴波那契数定义: · 位置0的裴波那契数为0 · 1和2的裴波那契数为1 · n(n > 2)裴波那契数为 (n-1)的裴波那 ...
- EasyExcel小试牛刀
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12029411.html 某种偶然的机会遇到了这个插件, 听说很牛X, 我之前也不知道, 不过还 ...
- mybatis 字段类型映射一览表
- (Elementui) el-tree 中英文过滤以及搜索到父子显示子节点,搜索到子节点显示父节点(filter-node-method)
案例下载:https://gitee.com/tudoumlp/just1.git (vue-ele-demo) 在项目中,会遇到树节点的搜索,中文和英文搜索,以及搜索到父节点匹配的时候同步显示该 ...
- 人工智能与智能系统3-> 机器人学3 | 移动机器人平台
机器人学的基本工具已经了解完毕,现在开始了解移动机器人,这部分包括机器人平台.导航.定位. 所谓机器人平台就是指机器人的物理结构及其驱动方式.本文将学习两种典型移动机器人平台(四旋翼和轮式车)的运动与 ...
- 集合、Collection、list、set、HashSet
一.集合的理解:将多个数据放在一起 简介: 1).可以动态保存任意多个对象,使用比较方便!2).提供了一系列方便的操作对象的方法: add.remove.set. get等 1.集合中的实现和继承图 ...