《C# 本质论》 第1章 C#概述

第一章 C#概述

注意 C#是区分大小写的语言:大小写不正确,会使代码无法成功编译。

C#从C和C++继承了基本的语法。语法标点(比如分号和大括号)、特性(比如区分大小写)和关键字(比如class、public、void) C#语言设计者从C/C++规范中删除了他们不喜欢的特性,同时创建了他们喜欢的。

1.1.1 创建、编辑、编译和运行C#源代码

写好C#代码后需要编译和运行。这时要选择使用那个.Net实现。这些实现通常打包成一个 软件开发包。(Software Development Kit,SDK),其中包括编译器、运行时执行引擎,运行时能访问的语言可访问功能框架,一些可能和SDK捆绑的其他工具(比如供自动化生成的生成引擎)。

如不确定要使用.Net框架,就默认选择.Net Core。它实现Linx、macOS和Microsoft Windows,是.NET开发团队投入的最大的实现。

使用Dotnet CLI

Dotnet命令dotnet.exe是Dotnet命令行接口,可用于生成C#程序的初始代码库并编译和运行程序。注意这里的CLI代表“命令行接口”(Command-Line Interface)。

创建目录:

md \HelloWorld

切换到目录:

cd /HelloWorld

执行dotnet new console命令来生成程序基架(或称程序项目)。这会生成几个文件,最主要的是Program.cs和项目文件:

dotnet new console

运行生成的程序。这会编译并运行由dotnet new console命令创建的默认Program.cs程序:

dot run

1.1.2 创建项目

无论Dotnet CLI还是VS都会自动创建几个文件。 .cs是所有C#文件的标准扩展名,也是编译器默认要编译成最终程序的扩展名。

虽然并非需要,但通常都会为C#项目生成一个项目文件。项目文件的内容随不同应用程序类型和.NET框架而变。但至少指出那些文件要包含到编译中,要生成什么应用程序类型,支持什么.NET框架,调试或启动应用程序需要什么设置,以及代码的其他依赖库。

1.1.3 编译和执行

dotnet build命令生成名为HelloWorld.dll的程序集。

dotnet build

扩展名.dll代表“ 动态链接库”(Dynamic Link Library)。所有程序集都是用.dll扩展名。控制台程序也不例外。

开发人员可以不用dotnet run 能直接运行的控制台程序,而是创建可由其他较大的程序来引用的库。库也是程序集。换言之,一次成功的C#编译,结果必然是 程序集,无论该程序集是程序还是库。

使用Dotnet CLI

1,要用Dotnet CLI生成并执行代码,请打开命令提示符,将当前目录设为EssentialCSharp.sln文件所在的目录。执行dotnet build命令编译所有项目。

2,要运行特定项目的源代码,导航到项目文件所在目录并执行dotnet run命令。另外,在任何目录都可以执行dotnet run -p命令。其中是要执行的项目文件的路径

dotnet run-p .\src\Chapter01\Chapter01.csproj

使用Visual Studio

在vs中打开解决方案文件后,选择“生成”|“生成解决方案”(F6)来编译代码。要执行某一章的项目,需要先将该章的项目“设为启动项目”。

1.2 C#语法基础

初学者主题:关键字

为了帮助编译器 ==解释==代码,C#中某些单词具有特殊地位和含义,它们称为关键字。编译器根据关键字的固有语法来解释程序员写的表达式。例如class,static和void均是关键字。

编译器根据关键字识别代码的结构与组织方式。由于编译器对这些单词有着严格的解释,所以只能将关键字放在特定位置。

1.2.1 C#关键字

C#1.0之后没有引入任何新的保留关键字,但在后续版本中,一些构造使用了上下文关键字,它们在特定的位置才有意义,其他位置无意义。

在C#2.0设计之初,语言设计者将yield指定为关键字,但最终选择使用yield return而非yield,从而避免将yield作为新关键字。

1.2.2 标识符

和其他语言一样,C#用标识符标识程序员编码的构造。在代码清单1.1中,HelloWorld和Main均为标识符。分配标识符以后,以后将引用它所标识的构造。因此,开发者应分配有意义的名称,不要随心而为。

设计规范

•要更注重标识符的清晰而不是简短。

•不要再标识符名称中使用单词缩写。

•不要使用不被广泛接受的首字母缩写词,即使被广泛接受,非必要也不要用。

•下划线虽然合法,但标识符一般不要包含下划线、连字号或卡非字母/数字字符。

设计规范

•要把两个字母的首字母缩写词全部大写。

•包含三个或更多字母的首字母缩写词,仅第一个字母才要大写,除非该缩写词是camelCase标识符的第一个单词。

•再cameCase标识符开头的首字母缩写词中,所有字母都不要大写。

•不要使用匈牙利命名法(为变量名称附加类型前缀)。

高级主题 :关键字

虽然罕见,但关键字附加“@”可作为标识符使用。但是不符合规范。

1.2.3 类型定义

C#所有代码都出现在一个类型定义的内部,最常见的类型定义以class开头。根据约定取名规范遵从PascalCase风格。

设计规范

•要用名词或名词短语命名类。

•要为所有类名使用PascalCase大小写风格。

•程序通常包含多个类型,类型包含多个方法。

1.2.4 Main方法

初学者主题: 什么是方法

方法可执行计算或者操作。与书面语中的段落相似,方法提供了结构化和组织代码的一种方式,是指更易读。更重要的是方法可以重用,可从多个地方调用,所以避免了代码的重复。方法声明除了引入方法并定义方法名,还要定义传入和传出方法的数。

高级主题:Main方法声明

args参数用于接受命令行参数的字数串数组。但数组第一个元素不是程序名称,而是可执行文件名称后的第一个命令行参数。

Main返回的int是==状态码==,标识程序执行是否成功,返回非零值通常意味错误。

语言对比:C++/Java main()全部是小写的。

将Main方法指定为static意味着这是“静态”方法,可用类名.方法名的形式调用.不指定static,用于启动程序的命令控制台还要先对类进行实例化,然后才能调用方法。

C#和C/C++一样使用大括号封闭构造(比如类或者方法)的主体。

1.2.5 语句和语句分隔符

高级主题:无分号的语句

不要求分号的一个例子是switch语句。由于大括号总是包含在switch语句中,所以不要求语句后跟分号。事实上,代码块本身就被视为语句,不要求以分号结尾。有的编程元素(比如using指令)虽然末尾由分号但不被视为语句。

换行与否不影响语句的分隔,所以可将多条语句放到同一行。

C#还允许一条语句跨越多行。

1.2.6空白

分号使C#编译器能够忽略代码中的空白。

初学者主题:什么是空白?

空白是一个或者多个连续的格式字符。删除所有空白容易造成歧义。

程序员经常利用空白对代码进行缩进来增强可读性。

初学者主题:用空白格式化代码

1.3 使用变量

变量一经声明,数据类型不能改变。

初学者主题:局部变量

变量是存储位置的符号名称,程序以后可对该存储位置进行赋值和修改。局部意味着变量再方法或代码块({}内)内部声明,其作用域“局部”于当前代码块。声明变量定义一个变量,你需要:

1,指定变量包含的数据类型:

2,为它分配标识符,即变量名。

1.3.1 数据类型

初学者主题:什么是数据类型

数据类型 是具有相似特征和行为的个体的分类。例如动物就是一个类型。在编程语言中,类型是被赋予了相似特性的一些个体的定义。

1.3.2 变量的声明

可以在同一条语句中声明多个变量,办法是用逗号隔开不同标识符。所有变量具有相同类型。

C#变量名可用任何字母或下划线(_)开头,后跟任意数量的字

母、数字和/或下划线。但根据约定,局部变量名采用camelCase命名(除了第一个单词,其他每个单词的首字母大写),而且不包含下划线。

设计规范

•局部变量使用camelCase风格命名。

1.3.3 变量的赋值

局部变量声明后必须在读取前赋值。一个办法是使用=操作符,,或者称为简单赋值操作符。。操作符是一种特殊符号,标识了代码要执行的操作。

C#要求局部变量在读取前“明确赋值”。此外,赋值作为一种从操作会返回一个值。所以C#允许在同一语句中进行多个赋值操作。

1.3.4 变量的使用

赋值后就能使用变量名引用值。

高级主题:字符串不可变

所有string类型的数据,不管是不是字符串字面值,都是不可变的(不可修改)。也就是说,不能修改变量最引用的数据,只能重新赋值,让它指向内存的新位置。

1.4 控制台输入和输出

可用System.COnsole.ReadLine()方法获取控制台输入的文本。他暂停程序执行并且等该用户输入。用户按回车键,程序继续。

System.Console.ReadLine()方法的输出,也称为返回值,就是用户输入的文本字符串。

字符串插值 在Console.Write Line调用中为字符串字面值附加的$前缀。表示使用了字符串插值。

string name = "World";
string greeting = $"Hello, {name}!";

复合格式化 它要求先提高格式字符串 来定义输出格式。注意索引从0开始,每个要插入的实参,或者称为格式项

C#6.0风格的字符串插值,几乎被符合格式化容易理解的多,默认使用前者

1.5 注释

带分隔符/*注释*/

单行注释//注释

没有注释但可读性好的代码,比需要注释才能说清楚的代码更有价值。如开发人员法子按需要写注释才能说清楚代码块的功用,应考虑重构。

XML带分隔符的注释 /注释/ 只是编译器会注意XML注释的存在,而且可以把它们放到一个单独的文本文件中。

XML单行注释 ///注释/// 同上

设计规范

•不要使用注释,除非代码本身一言难尽

•要尽量写清楚的代码而不是通过注释澄清复杂的算法。

初学者主题:XML

一种简单而灵活的文本格式,常用于Web应用程序以及应用程序间的数据交换。XML之所以“可扩展”,是因为XML文档中包含的是对数据进行描写的信息,也就是所有的元数据

1.6 托管执行和CLI

处理器不能直接解释程序集。程序集用的是另一种语言,即公共中间语言(Common Intermediate Language,CIL),或称中间语言。C#编译器将C#源代码文件转换为中间语言,为了将CIL代码转换成处理器能理解的机器码,还要完成额外的步骤。

该步骤设计C#程序执行的一个重要元素:VES(Virtual Execution System,虚拟执行系统)。VES也称为运行时(runtime)。它根据需要编译CIL代码,这个过程称为即时编译或JIT编译(just-in-time compilation)。代码在像“运行时”这样的一个“代理”的上下文中执行,就成为托管代码(managed code)。之所以称为“托管”,是因为“运行时”管理着诸如内存分配、安全性和JIT编译方面,从而控制主要的程序行为。执行时不需要“运行时”的代码称为本机代码(native code)或非托管代码(unmanager code)。

C#编译器将C#源代码转化为CIL,VES也叫运行时编译CIL后转换为机器码,这个过程称为JIT编译,且代码在虚拟执行系统中成为托管代码

注意 “运行时”可能指“程序执行的时候”,也可能指虚拟执行系统,本书指后者。前者用执行时代替。

“运行时规范”包含在**公共语言基础结构(CLI)**规范当中。

•VES或者“运行时”

•CIL

•支持语言互操作性的类型系统,称为CTS。

•如何编写通过CLI兼容语言访问库的直到原则,这部分放在,公共语言规范中。

•使各种服务能够CLI识别的元数据,包括程序集的布局或文件格式。

……

CIL和ILDASM

前面说过,C#编译器将C#代码转换为CIL代码而不是机器码。处理器只理解机器码,所以CIL代码必须转换为机器码才能由处理器执行。可用CIL反汇编程序将程序集解构为CIL。通常使用MIcrosoft特有的文件名ILDASM来称呼这种CIL反汇编程序,它能对程序集执行反汇编,提取C#编译器生成的CIL

反汇编.NET程序集的结果比机器码更易理解。许多开发人员害怕即使别人没有拿到源代码,程序也容易被反汇编并曝光其算法。无论是否基于CLI,任何程序防止反编译唯一安全的方法就是禁止访问编译好的程序(例如只在网站上存放程序,不把它分发到用户机器)。但加入目的只是减少别人获得源代码的可能性,可考虑使用一些混淆器产品。这种产品会打开IL代码,转换成一种功能不变但是更难理解的形式。

高级主题:HelloWorld.exe的CIL输出

基于这样的CIL代码清单,能够相对容易理解程序所做的事情。一些免费工具都能将CIL自动反编译成C#。

1.7.1 应用程序编程接口

数据类型(比如System.Console)的所有的方法(常规地说是成员)定义了该类型的 应用程序接口(Application Programming Interface,API)。API定义软件如何与其他组件交互,所以单独的数据类型还不够。通常是一组数据类型的所有API结合起来为某个组件集合创建一个API。.NET的所有程序集构成了更大的API。通常将这一组更大的API称为 框架API通常包含一组接口和协议或者指令,帮助你使用一些组件进行编程。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值