C#学习笔记(十)CSharp表达式与语句(二)ildasm打开反编译器+foreach本质
语句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本质相关推荐
- 乐优商城学习笔记十九-商品详情(二)
2.页面静态化 2.1.简介 2.1.1.问题分析 现在,我们的页面是通过Thymeleaf模板引擎渲染后返回到客户端.在后台需要大量的数据查询,而后渲染得到HTML页面.会对数据库造成压力,并且请求 ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- 吴恩达《机器学习》学习笔记十——神经网络相关(2)
吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...
- mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务
逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...
- Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件
Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...
- 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程
8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...
- mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解
本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...
- IOS之学习笔记十五(协议和委托的使用)
1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...
- 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进
吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...
最新文章
- INDEX_JOIN
- Android系统启动-zygote篇
- centos 7.9 scp命令 实现远程拷贝文件
- C++ int转string的几种方法比较
- python怎么导入大小字母_isort-用于对python导入的库按照字母进行排序的工具
- Gartner 发布2019年超融合魔力象限:新增深信服一员!
- java 去掉 t_关于Java:在LocalDateTime中不能删除“ T”
- 记录一个Lock和sychronized应用及双检锁
- 提取source引擎.mdl模型,并转unity引擎.fbx
- nodejs+vue+elementui 青少年编程在线考试系统python java php
- bne 1b什么意思
- 一位资深程序员大牛给予Java初学者的学习建议
- Latex CJK,tex使用中文
- 你的样子抖音版,架子鼓版
- 用python制作专属有声小说
- 最中二的性能测试工具--vegeta
- 直播软件开发,独特功能简介,“直播+”成标配
- windows10电脑无法连接到internet怎么解决
- Linux系统引导过程及修复
- 人机对战初体验:Python基于Pygame实现四子棋游戏