语句Statements.

语句等价于一个或一组有明显逻辑关联的指令

在汇编语言的书《Assembly Language step by step》中有一句话:

像Pascal或者C++这类语言的编译器的功能:就是去决策如何把给定的一些语句翻译成一系列的机器语言的指令

如何查看Csharp编译后的低级汇编语言:

右键【项目名称】选择【在文件资源管理器中打开文件夹】中,选择【bin】下【Debug】下的exe文件。将应用文件复制到桌面。

然后子【win】中搜索visual Studio Tools

双击打开。实际上是一个命令行,为我们加载了一系列必要工具。在命令行中我们输入ildasm回车。(il叫中间语言,dasm叫反编译。)打开了IL DASM工具软件。这个工具帮助我们查看,编译好的Csharp的低级源代码。

打开我们在桌面上复制好的exe。查看,可以看到命名空间和类,以及类下的方法名称。但是因为低级语言照顾的是机器,不是人类,所以很难读懂。

高级语言中的表达式对应低级语言中的指令。

一组表达式组成一个语句,一个语句等价于一个或一组有明显逻辑关联的指令。

C#中语句的定义:程序执行的动作是由语句来表达的。语句有以下功能:

1、声明变量;declaring variables

2、对变量赋值;assigning values

3、调用函数;calling methods

4、集合中循环;looping through collections

5、根据给定的条件在分支之间跳转:branching to one or another block of code ,depending on a given conditon。

语句的执行顺序称为:控制流或者执行流。

语句简言之:陈述算法思想、控制逻辑走向、完成有意义的动作(Action)。

C#中语句由分号结尾,但是由分号结尾的不一定都是语句。比如程序开头使用using System;这个不是语句,这个是using指令。通过指令引入了名称空间。

class student
{public string Name;  //也不是语句,这叫字段的声明。不叫字段的声明语句。
}

语句一定是出现在方法体中。语句一定出现在方法体中。



语句详解

语句Statement有三大类:

  • 标签语句labeled-statement:不多见

  • 声明语句declaration-statement:声明变量、常量。

  • 嵌入式语句embedded-statement: 一个大类别,分为以下几类。

标签语句:

//标签语句。
hello: Console.WriteLine("hello world");
goto hello;

嵌入式语句Embedded-statement:

  • 1、声明语句:声明语句由两部分构成,一部分是数据类型,一部分是变量声明器。int x; var y;   int就是type类型声明,var是另一类需要编译器猜测的数据类型。x和y就是声明器。后面也可以跟一个初始化器。int x =100;

    • 局部变量声明
    • 局部常量声明:一旦声明,不希望值再改变。const int x =100;常量声明的时候,必须初始化值。

面试题:以下两个语句是不是一回事。

int x =100;
int x;
x = 100;

第一种情况:int x =100;是声明变量时,追加初始化器。

第二种情况:声明的时候没有初始化,而在后面对变量进行赋值。

前面是一步操作,后面是两步操作。

// 数组初始化器:一对花括号,然后里面写上元素。
int[] myArray = {1,2, 3};
//整型数组类型。
  • 2、表达式语句:由表达式计算出来的值(如果有)被丢弃。只关心动作,不关心结果。
Console.WriteLine       // 这叫成员访问,不叫方法调用。
Console.WriteLine("方法调用表达式语句:invacation-expression");     // 调用,重载决策。

对象创造表达式:object-creation-expression:new操作符,会创建一个对象,然后调用对象的构造器。new Form();没有任何赋值给任何变量来接收承载,很快gcc就把他回收了,但仍是一条语句。

赋值表达式:assignment

后、前置自增表达式:x++;++x;

后、前置自减表达式:x--;--x;

await-expression:在异步中讲解。

  • 3、块语句block:用于在只允许使用单个语句的上下文中编写多条语句。写在花括号{中}。

并非所有的花括号都是块,平时用于构造名称空间体、类体、方法体。

因为语句一定也只能出现在方法体中。所以方法体中的花括号才可以考虑是不是块。

1)块语句的花括号中,不论有多少语句,编译器都看做为一条语句。

2)块语句后不需要加分号。

VS使用小技巧:按【Ctrl】再按【右花括号】。可以在VS中,找到成对的花括号。阅读程序时很方便。在开始和结束之间反复跳动。

变量的作用域:块中的变量可以访问到同一方法下的其他变量,其他变量不可以访问到块中的变量。块中变量,出了块,没用了。

int x = 100;
{Console.WriteLine(x);int y = 200;Console.WriteLine(y);
}
//Console.WriteLine(y);// 100
// 200
最外面的Console.WriteLine无法编译通过。
  • 4、选择(判断、分支)语句selection-statement

if 语句:if语句中只能放入嵌入式语句,而且只能放一条。如果放入的逻辑比较复杂怎么办?上面所讲嵌入式语句中有一种叫块语句(语句的容器:把多条语句,整合成一条语句)

int x = 200;
int y = 100;
if (x<y)Console.WriteLine("hello");Console.WriteLine("world");

不论条件是否成立:第二个cw都会打印出来。因为if只能控制一条语句。第二条不归他管。为了执行多条语句:此时需要引入块语句。

小技巧:建议:在任何时候使用if语句都使用块语句。同时在VS借用编译器if按两下tab键自动补全结构。

switch语句:switch表达式的类型为:sbyte、byte、short、ushort、int、uint、long、ulong、bool、char、string、enum-type。不可以为double类型。case后接的必须是const值。

class Program
{static void Main(string[] args){Level myLevel = Level.High;switch (myLevel){case Level.High:break;case Level.Mid:break;case Level.Low:break;default:break;}}
}enum Level
{High,Mid,Low
}

小技巧:在VS编译器中,输入switch连续按两下tab键,即可自动补全switch结构,然后将switch(switch_on)中替换成myLevel直接按回车,就会自动补全剩下内容。

建议:在写switch时,无论什么时候,都建议将default写出来,以免意想不到的逻辑发生。

  • 5、try语句
  • 6、迭代(循环)语句:iteration-statement

while语句

List<int> intList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
IEnumerator enumerator = intList.GetEnumerator();
while (enumerator.MoveNext())
{Console.WriteLine(enumerator.Current);
}//enumerator.Reset();
while (enumerator.MoveNext())
{Console.WriteLine(enumerator.Current);
}

for语句

do..while语句

foreach语句:最适合对集合进行遍历。

  • 7、跳转语句:jump-statement

continue语句:放弃当前这次循环,立刻开始下一轮循环。

break语句:立即结束循环语句。

只能跳转当前所在层的循环,无法影响外层循环。

return语句:今早使用原则:可以让读代码的人,最短的时候内知道目的。


foreach语句拓展:(为P29显示接口隔离,重新整理一遍)

集合的遍历两个问题:1、什么样的集合可以被遍历?2、迭代器。

在C#语言中,所有数组的基类都是Array。

int[] intArray = new[] {1, 2, 3, 4, 5, 6, 7};
Console.WriteLine(intArray.GetType().FullName);
Console.WriteLine(intArray is Array);

输出

System.Int32[]
True

右键Array,转到定义(或直接按F12)。看一下它实现了哪些接口。

其中IEnumerable就是可以被遍历的集合。转入IEnumerable的定义。里面只有唯一的一个GetEnumerator方法,获取集合迭代器。Enumerator就是迭代器。C#中所有可以迭代的集合,都能够获得自己的迭代器。

再看一个泛型的list。

List<int> listInt = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };

它也实现了IEnumerable接口。

第一个问题解决了,什么样的集合可以迭代,来使用foreach来遍历。

我们来添加一个新的名称空间的引用。

using System.Collections;

以接口作为一个类型声明一个变量:获取整型数组的迭代器。

IEnumerator enumerator = intArray.GetEnumerator();

什么叫迭代器?

将鼠标右键:IEnumerator。或者直接按F12。查看定义:里面有一个MoveNext方法。返回值是bool类型的值。如果迭代器可以往后移动,拿到下一个数,就返回True。如果拿不到就到此为止。只读Current属性就代表当前访问的元素。reset就是把迭代器拨回到最开始的位置。这就是迭代器。

static void Main(string[] args)
{int[] intArray = new[] { 1, 2, 3, 4, 5, 6, 7 };IEnumerator enumerator = intArray.GetEnumerator();//指月while (enumerator.MoveNext()){Console.WriteLine(enumerator.Current);}// enumerator.Reset();while (enumerator.MoveNext()){Console.WriteLine(enumerator.Current);}
}

结果只打印一次遍历结果,因为当执行一遍while之后,迭代器已经指向了最后一个元素。再一次访问,Next返回值为false。所以第二遍不会打印。如果我们调用enumerator.Reset()方法,就可以拨回到集合的最开始。此时可以打印两次。

foreach循环就是对集合遍历的简记法。foreach中的迭代变量就相当于我们的迭代器中的enumerator.Current。

C#学习笔记(十)CSharp表达式与语句(二)ildasm打开反编译器+foreach本质相关推荐

  1. 乐优商城学习笔记十九-商品详情(二)

    2.页面静态化 2.1.简介 2.1.1.问题分析 现在,我们的页面是通过Thymeleaf模板引擎渲染后返回到客户端.在后台需要大量的数据查询,而后渲染得到HTML页面.会对数据库造成压力,并且请求 ...

  2. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  3. 吴恩达《机器学习》学习笔记十——神经网络相关(2)

    吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...

  4. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

  5. Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件

    Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...

  6. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  7. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  8. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  9. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

最新文章

  1. INDEX_JOIN
  2. Android系统启动-zygote篇
  3. centos 7.9 scp命令 实现远程拷贝文件
  4. C++ int转string的几种方法比较
  5. python怎么导入大小字母_isort-用于对python导入的库按照字母进行排序的工具
  6. Gartner 发布2019年超融合魔力象限:新增深信服一员!
  7. java 去掉 t_关于Java:在LocalDateTime中不能删除“ T”
  8. 记录一个Lock和sychronized应用及双检锁
  9. 提取source引擎.mdl模型,并转unity引擎.fbx
  10. nodejs+vue+elementui 青少年编程在线考试系统python java php
  11. bne 1b什么意思
  12. 一位资深程序员大牛给予Java初学者的学习建议
  13. Latex CJK,tex使用中文
  14. 你的样子抖音版,架子鼓版
  15. 用python制作专属有声小说
  16. 最中二的性能测试工具--vegeta
  17. 直播软件开发,独特功能简介,“直播+”成标配
  18. windows10电脑无法连接到internet怎么解决
  19. Linux系统引导过程及修复
  20. 人机对战初体验:Python基于Pygame实现四子棋游戏

热门文章

  1. ThinkCentre台式机windows重装为linux找不到硬盘
  2. 在Windows 10中HP 5100打印出来是黑方框的解决方法
  3. IE1011安装失败出现9C59代码之解决方案,
  4. 【读书笔记】《waht is mathematic》第一章补充——数论
  5. c语言求100内素数
  6. Java 开发中常见的异常有哪些?
  7. 社交媒体的神操作:如何在互联网上删去一段历史?
  8. Flash文件系统介绍和平台采用squashfs+ubifs原因
  9. 关于敏感字符的筛选替换
  10. 关于sql注入这一篇就够了(适合入门)