【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版)的读书笔记第二篇(基础概念--躯壳篇),有着部分第三章的知识内容,当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的, ...
随机推荐
- Cesium中级教程2 - 图层
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium支持从几个标准服务绘制和添加高分辨率图像(地图)图层 ...
- java-异常-finally代码块
1 package p1.exception; 2 3 4 class Demo_0{ 5 public int show(int index) throws ArrayIndexOutOfBound ...
- Java高效开发-常用idea插件
这里推荐几个常用的idea插件,可以大大提高开发的效率 所使用的idea版本为 2021.2.3 1.Jrebel and Xrebel for IntelliJ Jrebel用于热部署,避免频繁重启 ...
- 关于Linux安装中NAT模式和桥接模式的区别详解(转载)
1.一般我们在创建一个Linux虚拟机时候,会面临三个网络配置选择: 桥接模式.nat模式.host-only模式(主机模式,这个模式用得少,就不介绍了) 2.NAT模式: 所谓nat模式,就是虚拟系 ...
- Python初学笔记列表&元组&字典
一.从键盘获取 1 print("请输入") 2 username = input("姓名:") 3 age = input("年龄:") ...
- Python打印JSON中中文的解决办法
code #!/usr/bin/python # encoding=utf-8 import json data = [{"a": "中文"}] print j ...
- 6. java IO 流
一.流的分类: * 1.操作数据单位:字节流.字符流 * 2.数据的流向:输入流.输出流 * 3.流的角色:节点流.处理流 *二.流的体系结构 * 抽象基类 节点流(或文件 ...
- 做开源界的MATLAB,PyMiner 需要更多热爱开源的你加入
MATLAB 和 Mathematica.Maple 并称为三大数学软件.它在数学类科技应用软件中在数值计算方面首屈一指.MATLAB 可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其 ...
- Redis sentinel.conf配置文件详解
redis-sentinel.conf配置项说明如下: 1.port 26379 sentinel监听端口,默认是26379,可以修改. 2.sentinel monitor <master-n ...
- python办公自动化系列之金蝶K3自动登录(二)
接上一篇博文python办公自动化系列之金蝶K3自动登录(一),我们接着聊聊利用python脚本实现金蝶K3 Wise客户端自动登录这一需求. 如上图所示,自动选择[组织机构]后,我们还需要驱动[当前 ...