ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:54.82KB ,
资源ID:18890321      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18890321.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C#锐利Word下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C#锐利Word下载.docx

1、 我们可以打开 Windows 自带的简易的记事本程序来编写这段代码-笔者推荐刚开始 采用这个极其简单却能把程序代码暴露的相当清晰的编辑工具. 我们将它的文件名保存 为 HelloWorld.cs,其中.cs是 C#源代码文件的扩展名.然后在配置好 C#编译器的 命令行环境里键入csc HelloWorld.cs编译文件.可以看到编译输出文件 HelloWorld.exe.我们键入 HelloWorld 执行这个文件可得到下面的输出: Hello World ! 下面我们来仔细分析上面的代码和整个程序的编译输出及执行过程. 先看文件开始的两 行代码,这是 C#语言的单行注释语句.和 C+语言类

2、似,C#支持两种注释方法:以 /开始的单行注释和以/*,*/配对使用的多行注释.注释之间不能嵌套. 再来看下面的using System;语句,这是 C#语言的 using 命名空间指示符,这里的 System是 Microsoft.NET 系统提供的类库.C#语言没有自己的语言类库,它直接 获取 Microsoft.NET 系统类库.Microsoft.NET 类库为我们的编程提供了非常强大的 通用功能.该语句使得我们可以用简短的别名Console来代替类型 当然 using 指示符并不是必须的, 我们可以用类型的全局名字来 System.Console. 获取类型.实际上,using 语句

3、采用与否根本不会对 C#编译输出的程序有任何影响, 它仅仅是简化了较长的命名空间的类型引用方式. 接着我们声明并实现了一个含有静态 Main()函数的 HelloWorld 类.C#所有的声明和 实现都要放在同一个文件里,不像 C+那样可以将两者分离.Main()函数在 C#里非 常特殊,它是编译器规定的所有可执行程序的入口点.由于其特殊性,对 Main()函数 我们有以下几条准则: 1. Main()函数必须封装在类或结构里来提供可执行程序的入口点. 采用了完全 C# 的面向对象的编程方式,C#中不可以有像 C+那样的全局函数. 2. Main()函数必须为静态函数(static).这允许

4、C#不必创建实例对象即可运行程 序. 3. 但一 Main()函数保护级别没有特殊要求, public,protected,private 等都可, 般我们都指定其为 public. 4. Main()函数名的第一个字母要大写,否则将不具有入口点的语义.C#是大小写 敏感的语言. 5. Main()函数的参数只有两种参数形式:无参数和 string 数组表示的命令行参 数,即 static void Main()或 static void Main(stringargs) ,后者接受命令行 参数.一个 C#程序中只能有一个 Main()函数入口点.其他形式的参数不具有入口 点语义,C#不推荐通

5、过其他参数形式重载 Main()函数,这会引起编译警告. 6. 其他形式的返回值不 Main()函数返回值只能为 void(无类型)或 int(整数类型). 具有入口点语义. 我们再来看HelloWorld.cs程序中 Main()函数的内部实现.前面提过,Console 是 在命名空间 System 下的一个类,它表示我们通常打交道的控制台.而我们这里是调 用其静态方法 WriteLine().如同 C+一样,静态方法允许我们直接作用于类而非实 例对象.WriteLine()函数接受字符串类型的参数,并把它送入控制台 显示.如前所述,C#没有自己的语言类库,它直接获取 Microsoft.N

6、ET 系统类库.我 们这里正是通过获取 Microsoft.NET 系统类库中的 System.Console.WriteLine()来 完成我们想要的控制台输出操作.这样我们便完成了程序. 但事情远没那么简单!在我们编译输出执行程序的同时, Microsoft.NET 底层的诸多机 制却在暗地里涌动,要想体验 C#的锐利,我们没有理由忽视其背靠的 Microsoft.NET 平台.实际上如果没有 Microsoft.NET 平台,我们很难再说 C#有何锐利之处.我们先 来看我们对文件用 csc.exe 命令编译后发生了什么.是的,我们得到 了 HelloWorld.exe 文件.但那仅仅是事

7、情的表象,实际上那个 HelloWorld.exe 根本 不是一个可执行文件!那它是什么?又为什么能够执行? 好的,下面正是回答这些问题的地方.首先,编译输出的 HelloWorld.exe 是一个由中 间语言(IL),元数据(Metadata)和一个额外的被编译器添加的目标平台的标准可执 行文件头(比如 Win32 平台就是加了一个标准 Win32 可执行文件头)组成的 PE (portable executable,可移植执行体)文件,而不是传统的二进制可执行文件-虽 然他们有着相同的扩展名.中间语言是一组独立于 CPU 的指令集,它可以被即时编译 器 Jitter 翻译成目标平台的本地代

8、码.中间语言代码使得所有 Microsoft.NET 平台的 高级语言 C#,VB.NET,VC.NET 等得以平台独立,以及语言之间实现互操作.元数据 是一个内嵌于 PE 文件的表的集合.元数据描述了代码中的数据类型等一些通用语言运 行时(Common Language Runtime)需要在代码执行时知道的信息.元数据使 得.NET 应用程序代码具备自描述特性,提供了类型安全保障,这在以前需要额外的类 型库或接口定义语言(Interface Definition Language,简称 IDL). 这样的解释可能还是有点让人困惑,那么我们来实际的解剖一下这个 PE 文件.我们采 用的工具是

9、.NET SDK Beta2 自带的 ildasm.exe,它可以帮助我们提取 PE 文件中的 有关数据.我们键入命令ildasm /output:HelloWorld.il HelloWorld.exe,一般可 以得到两个输出文件:helloworld.il 和 helloworld.res.其中后者是提取的资源文件, 我们暂且不管,我们来看 helloworld.il 文件.我们用程序打开可以看到元数 据和中间语言(IL)代码,由于篇幅关系,我们只将其中的中间语言代码提取出来列于 下面,有关元数据的表项我们暂且不谈: class private auto ansi beforefieldi

10、nit HelloWorld extends mscorlibSystem.Object .method public hidebysig static void .entrypoint / Code size .maxstack 8 IL_0000: IL_0005: IL_000a: ldstr call ret void mscorlibSystem.Console:WriteLine(string) 11 (0xb) Main() cil managed / end of method HelloWorld:Main .method public hidebysig specialna

11、me rtspecialname instance void / Code size .maxstack 8 IL_0000: IL_0001: IL_0006: ldarg.0 call ret instance void mscorlibSystem.Object:.ctor() 7 (0x7) .ctor() cil managed.ctor / end of class HelloWorld 我们粗略的感受是它很类似于早先的汇编语言,但它具有了对象定义和操作的功能.我 们可以看到它定义并实现了一个继承自 System.Object 的 HelloWorld 类及两个函 数: 其中 可在

12、 Main()和.ctor(). .ctor()是 HelloWorld 类的构造函数, 源代码中我们并没有定义构造函数呀-是的,我们没有定义构造函数,但 C#的编译器 为我们添加了它. 你还可以看到 C#编译器也强制 HelloWorld 类继承 System.Object 类,虽然这个我们也没有指定.关于这些高级话题我们将在以后的讲座中予以剖析. 那么 PE 文件是怎么执行的呢?下面是一个典型的 C#/.NET 应用程序的执行过程: 1. 用户执行编译器输出的应用程序(PE 文件),操作系统载入 PE 文件,以及其他 的 DLL(.NET 动态连接库). 2. 操作系统装载器根据前面 PE

13、 文件中的可执行文件头跳转到程序的入口点.显 然, 操作系统并不能执行中间语言, 该入口点也被设计为跳转到 mscoree.dll .NET ( 平台的核心支持 DLL)的_ CorExeMain()函数入口. 3. CorExeMain()函数开始执行 PE 文件中的中间语言代码.这里的执行的意思是 通用语言运行时按照调用的对象方法为单位,用即时编译器将中间语言编译成本地 机二进制代码,执行并根据需要存于机器缓存. 4. 5. 程序的执行过程中,垃圾收集器负责内存的分配,释放等管理功能. 程序执行完毕,操作系统卸载应用程序. 清楚的知晓编译输出的 PE 文件的执行过程是深度掌握 C#语言编程

14、的关键,这种过程 的本身就诠释着 C#语言的高级内核机制以及其背后 Microsoft.NET 平台种种诡秘的 性质.一个程序的概括力已经足够,在我们对 C#语言有了一个很好的 起点之后, 下面的专题会和大家一起领略 C#基础语言, 窥探 Microsoft.NET 平台构造, 步步体验 C#锐利编程的极乐世界,Lets go! 返回页首 第二讲 第二讲 C#语言基础介绍 在体验 C#的锐利之前,关乎语言基本知识的掌握是必不可少的一环.由于 C#基本语 言很多源自 C/C+,在这里对那些和 C/C+类似的地方仅作简单介绍,我们将体验 专注于那些区别于传统 C/C+的关键的语言基础知识. 数据类

15、型 C#语言的数据类型主要分为两类:值类型和引用类型.另外一种数据类型指针是为 其中 unsafe 上下文指对代码进行 unsafe 标示以满足 unsafe 上下文编程专门设定的, 利用指针对内存直接进行操作要求的 C#非托管代码,这些代码将失去 Microsoft.NET 平台的垃圾收集等 CLR 性质,我们放在COM 互操作 非托管编程与异常处理专题里 阐述.值类型的变量本身包含他们的数据,而引用类型的变量包含的是指向包含数据的 内存块的引用或者叫句柄.从下面这幅图中可以清晰地看出两者的差别: 引用类型带来的可能的问题便是当多个变量引用同样的内存块时, 对任何一个引用变量 的修改都会导致

16、该对象的值的改变.null 值表示引用类型没有对任何实际地址进行引 用. 值类型可分为结构类型和枚举类型.结构类型包括简单类型和用户自定义结构类型.枚 举类型和用户自定义结构类型我们将在第九讲 结构,枚举,数组与字符串专题里详 细阐述.简单类型又可分为布尔类型和数值类型.C#语言中布尔类型严格与数值类型 区分,只有 true 和 false 两种取值,不存在像 C/C+里那样和其他类型之间的转换. 数值类型包括整值,浮点和 decimal 三种类型.整值类型有 sbyte,byte,short, ushort,int,uint,long,ulong,char 共九种.除了 char 类型外,其

17、他 8 种两两 一组分别为有符号和无符号两种.浮点值有 float 和 double 两种.decimal 主要用于 金融, 货币等对精度要求比较高的计算环境. 下表是对这些简单类型的一个详细的描述: 简单类型 描 述 sbyte short int long byte ushort uint ulong 8-bit 有符号整数 16-bit 有符号整数 32-bit 有符号整数 64-bit 有符号整数 8-bit 无符号整数 16-bit 无符号整数 32-bit 无符号整数 64-bit 无符号整数 示 例 sbyte val = 12; short val = 12; int val

18、= 12; long val1 = 12; long val2 = 34L; byte val1 = 12; byte val2 = 34U; ushort val1 = 12; ushort val2 = 34U; uint val1 = 12; uint val2 = 34U; ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; float val = 1.23F; float 32-bit 单精度浮点数 double 64-bit 双精度浮点数 double val1 = 1.23; double

19、 val2 = 4.56D; bool val1 = true; bool val2 = false; char val = h; bool char 布尔类型 字符类型 ,Unicode 编码 28 个有效数字的 128-bit 十进制类型 decimal decimal val = 1.23M; 引用类型共分四种类型:类,接口,数组,委派.类除了我们可以定义自己的类型外, 又包括两个比较特殊的类型 object 和 string.object 是 C#中所有类型(包括所有的 值类型和引用类型)的继承的根类.string 类型是一个密封类型(不能被继承),其实 例表示 Unicode 字符串

20、,它和数组类型我们将放在第九讲 结构,枚举,数组与字符 串中详述.接口类型定义一个方法的合同,我们将在第七讲 接口 继承与多态中讲 述.委派类型是一个指向静态或实例方法的签名,类似于 C/C+中的函数指针,将在 第八讲 委派与事件中讲述. 实际上我们将从后面的专题中看到这些类型都是类的某种 形式的包装. 每种数据类型都有对应的缺省值.数值类型的缺省值为 0 或 0.0,其中 char 的缺省为 x0000.布尔类型的缺省值为 false.枚举类型的缺省值为 0.结构类型的缺省值是 将它所有的值类型的域设置为对应值类型的缺省值,将其引用类型的域设置为 null.所 有引用类型的缺省值为 null

21、. 不同类型的数据之间可以转换,C#的类型转换有隐含转换,明晰转换,标准转换,自 定义转换共四种方式.隐含转换与明晰转换和 C+里一样,数据从小类型到大类型 的转换时为隐含转换,从大类型的转换为明晰转换,明晰转换需要如 (Type)data一般的括号转换操作符.标准转换和自定义转换是针对系统内建转换和 用户定义的转换而言的,两者都是对类或结构这样的自定义类型而言的. 变量与常量 变量表示存储位置,变量必须有确定的数据类型.C#的类型安全的含义之一就是确保 变量的存储位置容纳着合适的类型.可以将 C#中的变量分为静态变量,实例变量,传 值参数,引用参数,输出参数,数组参数和本地变量共七种.本地变

22、量则是在方法体内 的临时变量. 静态变量和实例变量主要是针对类或结构内的数据成员(又叫域)而言的.静态变量在 它寄存的类或结构类型被装载后得到存储空间,如果没有对它进行初始化赋值,静态变 量的初始值将是它的类型所持有的缺省值. 实例变量在它的类实例被创建后获得存储空 间,如果没有经过初始化赋值,它的初始值与静态变量的定义相同.两者更详细的说明 我们放在第六讲 域 方法 属性与索引器专题里. 传值参数,引用参数,输出参数,数组参数主要针对方法的参数类型而言的.简单的讲 传值参数是对变量的值的一种传递,方法内对变量的改变在方法体外不起作用.对于传 值参数本身是引用型的变量稍有不同,方法内对该引用(

23、句柄)变量指向的数据成员即 实际内存块的改变将在方法体外仍然保留改变,但对于引用(句柄)本身的改变不起作 用.引用参数是对变量的句柄的一种传递,方法内对该变量的任何改变都将在方法体外 保留.输出参数是 C#专门为有多个返回值的方法而量身定做的,它类似于引用变量, 但可以在进入方法体之前不进行初始化,而其他的参数在进入方法体内 C#都要求明确 的初始化.数组参数是为传递大量的数组元素而专门设计的,它从本质上讲是一种引用 型变量的传值参数.它们更详细的阐述我们也放在专 题里. 本地变量严格的讲是在 C#的块语句,for 语句,switch 语句,using 语句内声明的变 量,它的生命周期严格地被

24、限制在这些语句块内部. 常量在编译时便确定它的值,在整个程序中也不许修改.常量声明的同时必须赋值.由 于它的编译时确定值的特性,引用类型可能的值只能为 string 和 null(除 string 外, 引用类型的构建器必须在运行时才能确定引用类型的值). 操作符与表达式 C#保留了 C+所有的操作符,其中指针操作符(*和-)与引用操作符(&)需要有 unsafe 的上下文.C#摈弃了范围辨析操作符(:),一律改为单点操作符(.). 我们不再阐述那些保留的 C+的操作符,这里主要介绍 C#引入的具有特殊意义的几 个操作符:as,is,new, typeof,sizeof,stackalloc.

25、 as 操作符用于执行兼容类型之间的转换,当转换失败时,as 操作符结果为 null.is 操 作符用于检查对象的运行时类型是否与给定类型兼容,当表达式非 null 且可以转化为 指定类型时,is 操作符结果为 true,否则为 false.as 和 is 操作符是基于同样的类型 鉴别和转换而设计的,两者有相似的应用场合.实际上 expression as type 相当于 expression is type ? (type)expression : (type)null. 作为操作符的 new 用于在堆上创建对象和调用构造函数, 值得注意的是值类型对象 (例 如结构)是在堆栈上创建的,而引

26、用类型对象(例如类)是在堆上创建的.new 也用 于修饰符,用于隐藏基类成员的继承成员.为隐藏继承的成员,使用相同名称在派生类 中声明该成员并用 new 修饰符修改它.typeof 运算符用于获得某一类型的 System.Type 对象,我们将在第十讲 特征与映射里结合 Microsoft.NET 的类型系 统对它作详细的阐述.sizeof 运算符用于获得值类型(不适用于引用类型)的大小(以 字节为单位).stackalloc 用于在堆栈上分配内存块, 仅在局部变量的初始值设定项中 有效, 类似于 C/C+语言的_alloca. sizeof 和 statckalloc 都由于涉及内存的直接操

27、 作而需要 unsafe 上下文. 操作符重载使得自定义类型 (类或结构) C#里的某些操作符可以像 C+里那样被重载. 可以用简单的操作符来方便的表达某些常用的操作. 为完成一个计算结果的一系列操作符和操作数的组合称为表达式.和 C+一样,C#的 表达式可以分为赋值表达式和布尔表达式两种,C#没有引入新的表达式形式,我们对 此不再赘述. 命名空间与语句 C#采用命名空间(namespace)来组织程序.命名空间可以嵌套.using 指示符可以 用来简化命名空间类型的引用.using 指示符有两种用法.语句可以 使我们用简短的类型名来代替类型.using Output = System.Con

28、sole;语句可以使我们用别名Output来代替类型 .命名空间的引入大大简化了 C#程序的组织方式. C#语句可以分为标号语句,声明语句,块语句,空语句,表达式语句,选择语句,反 复语句,跳转语句,try 语句,checked/unchecked 语句,lock 语句,using 语句. 标号语句主要为 goto 跳转设计, 不允许跨方法的跳转, 但允许小规模的方法内的跳 C# 转.声明语句可以同时进行初始化赋值,对象的实例化声明需要 new 关键字.块语句 采用和定义语句块,主要是界定局部变量的作用范围.空语句在 C#中用分号 表示,没有执行语义.表达式语句通过表达式构成语句. 选择语句有

29、 if 语句和 switch 语句两种, C+别无二致. 与 反复语句除了 while,do,for 三种循环结构外引入了 foreach 语句用于遍历集合中所有的元素, 但这需要特定的接口 支持,我们在后面的章节里对之作详细阐述. 跳转语句有 break,continue,goto,return,throw 五种语句,前四种与 C+里 的语义相同, throw 语句与后面的 try 语句我们将在第十一讲 COM 互操作 非托管编 程与异常处理阐述. checked/unchecked 语句主要用于数值运算中溢出检查的上下文.lock 语句主要用 于线程信号量的锁控制.using 语句主要用于

30、片断资源管理.这些我们在后续章节里都 会有具体的涉及. 返回页首 第三讲 Microsoft.NET 平台基础构造 抛开 Microsoft.NET 平台去谈 C#是没有意义的,C#之Sharp也正在其后端强大的 平台.仅仅拘泥于语法层面是体验不了 C#的锐利之处的,C#程序很多诡秘之处必须 依靠 Microsoft.NET 平台才能深度的掌握和运用.简单的讲,Microsoft.NET 平台是 一个建立在开放互联网络协议和标准之上, 采用新的工具和服务来满足人们的计算和通 信需求的革命性的新型 XML Web 智能计算服务平台. 它允许应用程序在因特网上方便 快捷地互相通信,而不必关心使用何种操作系统和编程语言. 从技术层面具体来说,Microsoft.NET 平台主要包括两个内核,即通用语言运行时 (Common Language Runtime,简称 CLR)和 Microsoft.NET 框架类库,它们为 通用语言运行时是建立在操作系统最 Microsoft.NET

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1