《2023年CSharp入门经典学习笔记.pdf》由会员分享,可在线阅读,更多相关《2023年CSharp入门经典学习笔记.pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章:C#简介1.1 什么是.Net F r a mework特点:不限操作系统,不限应用程序类型,不限访问语言(通用类型系统,Com m。n St y I e S y stem,C S T)o包含:代码库、.Net公共语言运营库(Common L a n guage Run t i m e,CLR)Mi c rosof t 中间语言(M ic r o s o ft Intermed i at e Lang u a ge,MSIL)由VS完毕T本机代码 由JustInT i m e 编译器即JIT完毕c#应用程序代码程序集本机代码程序集编译应用程序时,所创建的MS I L 代码存储在一个程序
2、集中,程序集涉及可执行应用程序 文 献(.e xe )和其他应用程序使用的库(d l)。除包含M SIL代码外还包含元信息(即程序集中包含的数据信息,也称为元数据)和可选的资 源(M SIL使用的其他数据,例如声音文献和图片)。元信息允许程序集是完全自我描述的,不会出现无法将需要的数据添加到系统注册表中的情况。不必把运营应用程序所需要的所有信息都安装到一个地方。可以编写一些代码,执行多个应用程序所规定的任务。此时,通常把这些可重用的代码放在所有应用程序都访问的地方。在.N e t Frame w o r k中,这个建方是全局程序集高速缓存(Global Assembly C ache,GAC)
3、方法是:将包含代码的程序集放在包含该高速缓存的目录下即可。托管代码用.N et Fram e w o rk编写的代码在执行时是托管的,即CLR管理着运营程序,其方式是管理内存、解决安全性,以及允许进行跨语言调试等。在C#中,只能编写在托管环境下运营的代码,我们使用CLR的托管功能,让.N e t自己与操作系统交互。垃圾回收提醒:需要许多内存才干运营的代码应自己执行这样的检查,而不是坐等垃圾回收。链接在编译为M S IL语 言 的C#代码不一定包含在单独的文献中,可以把应用程序代码放在多个源代码文献中,再把它们编译到一个程序集中,这个过程称为链接。好处在于解决儿个较小的文献比解决一个大文献简朴的
4、多。1.2 什么是C#强大的语言:在C#中 与C+比较高级的功能等价的功能(例如直接访问和解决系统内存),只能在标记为“不安全”的代码中使用。类型安全的语言:在类型之间转换时,必须遵守严格的规则。第三章:变量和表达式(P 22)3.1 C#的基本语法区分大小写代码的突出显示功能:#r egi o n Name#e ndre g ion3.2 变量3.2.1简朴类型(P 2 6)S tr i ng的字符数没有上限。占位符(格式字符串)的使用举例:I nt mylntege r=1 7;S t r in g m y String=b 1 ar b I a r”;Con s o 1 e.W r it
5、eLi n e(0”,mylnte g erzm y S t r i n g);3 .2.2变量的命名(P 3 0)基本变量命名规则:变量名的第一个字符必须是字母、一或者,其后的字符可以是字母下划线或数字。命名约定:Mic r osof t建议,对于简朴的变量,使 用c a melCas e规则,而对于比较高级的命名则使用Pa s calCas e o3.2.3 字面值(P 3 1)逐字指定的字符串字面值:C:T e m p MyD i rM yFile.Doc;注意:字符串是引用类型,而其他类型都是值类型,所以字符串也可以指定n u ll值,即字符串变量不引用字符串。3.2.4变量的声明和赋
6、值3.3表达式(P 3 4)3.3.1 数学运算符举例说明运算符的位置与影响。问:i nt v arl,var2=5,var3=6;var 1 =v a r2+*-var3.varl 的值是多少?答:5*5=2 5把运算符放在操作数的前面,则操作数实在进行其他任何计算前受到运算符的影响,而把运算符放在操作数的后面,则操作数是在完毕表达式的计算后受到运算符的影响。3.3.2 赋值运算符(P38)3.3.3运算符的优先级优 先 级运 算 符H,一 一(用作前缀);+,-(一元)=,*=,/=,%=,+=,-=什 一 一(用作后缀)3.3.4命名空间U s in g用法:1、简化对已创建命名空间中包
7、含名称的访问,例:Nam e s p a c e Level 0 ne/nam e One d e fi n ed:U s ing L e v e 1 O n e;11 n a m e O ne.2、为命名空间提供一个别名,作为u s in g语句的一部分namespace LevelOne(using LT=LevelTwo;/name NameThree*definednamespace LevelTwo(/name NameThree*definedLevel 0 ne 命名空间中的代码把 Le v e 1 One.Name Three 引用为 Name Th r e e,把 Lev e
8、lOne.Lev e 1 Two.NameT h r e e 弓|用为 LT.Le v e ITwo.NameT h reeo假如u s ing语句声明如下:using LT=LevelOne.LevelTwo;namespace LevelOne(/name,NameThreeM definednamespace LevelTwo(/name“NameThree defined)这样全局命名空间中的代码和LevelOne命名空间就可以使用LT.NameTh r e e。注意:usin g语句自身不能访问另一个空间中的名称,除非命名空间中的代码以某种方式链接到项目上,或者代码是在该项目的源文献
9、中定义的,或在链接到该项目的其他代码中定义的。U sin g语句只是便于我们访问这些名称,减少代码量。第四章:流程控制(P44)4.1 布尔逻辑条件布尔运算符运 算 符类 别示例表达式结 果&二元varl=var2&var3;如果var2和 var3都是true,v arl的值就是tru e,否则为回se(逻辑与)II二元varl h var2|var3;如 果 var2或 var3是 true(或两者都是),v arl的值就是true,否则为false(逻辑或)&和II运算符与&和I运算符的区别是性能比较好:假如&的第一个操作数为f a l s e,就不需要考虑第二个操作数的值了,同样,假如
10、第一个操作数是tru e j I运算符就直接返回t r u e,无需考虑第二个操作数的值。而&和I的操作数总是要计算的。故要尽也许使用&和|。4.1.1 位运算符注意:整数存储在.NET中的方式称为2 的补位,即使用一元运算符 会使结果看起来有点古怪.假 定 int类型是一个32位的数字,则运算符 对所有32位进行操作,将有助于看出这种方式.例如,数 字 5 的完整二进制表示为:00000000000000000000000000000101数字-5 的完整二进制表示为:11111111111111111111111111111011实际上,按照2 的补位系统,(-x)定义为(x+l)。这个系
11、统在把数字加在一起时非常有用。例如,把 10和-5 加起来(即 从 10中减去5)的二进制表示为:00000000000000000000000000001010+11111111111111111111111111111011 100000000000000000000000000000101忽略最左端的1,就得到5 的二进制表示。像1=-2 这样的式子比较古怪,其原因是底层的结构强制生成了这个结果。a b相称于a*(2Ab),而a b相称于a/2并丢弃余数进行b次。4.1.2 布尔赋值运算符(P 5 0)&=、|=.4.1.3 运算符的优先级更新4.2 goto 语 句(P52)4.3 分
12、支?:运算符最常见用法:Co n sole.W r i teL i ne(ln 0 y e arl you will hav ea balance o f 2,t otal Y ears,tota 1 Yea r s=1?s f,b a 1 a n c e);注意:S w itc h分支中,一 个c as e语句结束不能进入下一个ca s e,但有一种情况例外,即一次检查多个条件,如下:switch()(case:case:code to execute if =*or-break;4.4循环4.4.1 d o 循环d o循环的结构如下:d o(w h i 1 e();提醒:while后的分号
13、是必须有的。4.4.2 wh i 1 e 循环4.4.3 fo r 循环4.4.4循环的中断(P69)break:立即终止循环。con t i n u e:立即终止当前循环,继续执行下一次循环。goto。:可以跳出循环到己标志好的位置上。re t u rn:跳出循环及其包含的函数。第五章变量的更多内容(P73)5.1.1 隐式转换类 型可以安全地转换为byteshort,ushort,int,uint,long,ulong,float,double,decimalsbyteshort,int,long,float,double,decimalshortint,lung,float,double
14、,decimalushortint,uint,long,ulong,float,double,decimalintlong,float,double,decimaluintlong,ulong,float,double,decimallongfloat,double,decimalulongfloat,double,decimalfloatdoublecharushort.inL uint lone.ulnne.float double,decimal隐式转换规则是:任何类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换到类型B。其他具体见释疑文档。5.1.2 显式转换(P75
15、)两个关键字 c h e c k e d(expre s s ion)和 u n ch e c k ed(e x p r ession)例:sho r t A=267;b y t e B;B=c h eck e d(byte)A);5.1.3 使用Convert命令进行显示转换5.2复杂的变量类型枚举,结构,数组5.2.1 枚 举(P81)En u m t ypeName(Valuel;V a I u e 2;ValueN;)声明这个新类型的变量:Typ e Name varN a m e;varName=typeName.val u e;枚举类型可提取的每个值都存储为该基本类型的一个值,在默
16、认情况下,该 类 型 为in to在枚举声明中添加类型,就可以指定其他基本类型:E num t ypeN a me:u n d erl y i ng Type(Valuel;Value2;ValueN;)枚举的基本类型可以是b y te,s b y t e,s hort,u sho r t,in t,uin t,Io n g,ulong.还可以使用一个值作为另一个枚举的基础值。要获得枚举的字符串值,可以使用Conve rt.ToStr i n g(),使 用(S tri ng)显示转换是不行的,由于需要进行的解决并不紧紧是把存储在枚举变量里中的数据放在string变量中,而是更复杂一些。此外,
17、也可以使用变量自身的ToS t ring()命令。也可以把str i n g转换为枚举值,但其语法略复杂一些。有一个特定的命令用于这种类型的转换,即Enum.P a rse (),使用方式如下:(en u m b erati o nTy p e)Enum.P arse(t ypeof(e n u mbe r a t i onTy p e),enumberatio nValue Str i n g);5.2.2 结 构(P85)struc t 要让调用结构的代码访问该结构的数据成员,可用关键字publico5.2.3 数 组(P87)1、声明数组数组的初始化有两种方式:可以以字面形式指定数组的完
18、整内容,也可以指定数组的大小,再使用关键字new初始化所有的数组元素。lnt my I n tArray=1,2,3,4,5;lnt mylntArray=n e w i n t5;(各元素默认数值为 0)也可以使用非常量的变量来进行初始化:I n t m y I ntArra y=new int a rraySize;也可以两者结合的方式声明,数组大小必须与元素个数相匹配:I n t mylntArray=new i n t5l,2,3,4,5;也可以使用非常量的变量来进行初始化,但该变量必须是常量Co n st in t arr a ySize=5;I n t mylntArray=new
19、 i ntarraySize 1,2,3,4,5;2、fore a c h 循环foreach(in)(/c a n use fo r each e I em e n t)fo r each对访问数组只进行只读访问,不能修改。3、多维数组double,h i IIHigh t=1,2,3,4,(2,3,4,5,3,4,5,6);第一位指定花括号,第二位指定花括号内的元素。4、数组的数组声明:lnt jaggedln t A r ra y;初始化的两种方式:可以初始化包含其他数组的数组,然后依次初始化子数组:jag g edlntAr r a y=n ew 2 E;j a ggedlntArra
20、 y 0=new i n t 3;j a g ge d IntArray 1 =new int 4;也可以j a gg e d I nt A r r a y=new int3=new i n t E1 2,3,new in t 1,new i nt 2,3;也可以简化,将数组的声明和初始化放在一行上:In t j a g g e dlntArray=new int 1,2,n ew int 2,n ew int 3);对变长数组可以使用foreach但通常需要嵌套该循环,才干得到实际的数据int divisorslTolO=newint 1newint 11,2,newint 1,3,newi
21、nt 1,2,4)9newint(1,5),newintd r2,3,6),newint(1,7,newint H r2,4,8,newint(lr3,9)tnewint 1,2,5,1 0);下面的代码会失败:foreach(int divisor in divisorslTolO)(Console.WriteLine(divisor)/这是由于数组diviso rs lT o lO包 含int口元素,而不是i n t元素,必须循环每个子数组及该数组自身:foreach(int divisorsOfInt in divisorslTolO)A(foreach(int divisor in d
22、ivisorsOfInt)(Console.WriteLine(divisor);5.3 字符串的解决(P94)1、将字符串转为c h a r数组:st r i ng myS t r ing=He 1 Io world!,z;char c h arA r r ay=my S tring.toC h ar A r ra y();2、将字符串转换为大写或小写形式:.T o Lower(),.Tollpp e r3、删除字符串中的空格:,Trim();4、删除其他字符char trimChars=,*e#s);string userResponse=Console.ReadLine();userRe
23、sponse 工 userResponse.ToLower();userResponse=userResponse.Trim(trimChars);if(userResponse-nyM)(/act on response)5、删除字符串前面或后面的空格.TrimS t art();.TrimE nd();6、解决字符串的空格,在字符串的左边或右边添加空格以达成规定长度.Pad Left();.PadRight();7、提供要添加到字符串上的字符S t ring m y St r ing=Ali g ned;m y S tri n g=my String.P a dLe f t(1 0,,);
24、8、按提供符号拆分字符串Ch a r sep a r ator=;myString.SpI i t(sepa r a t o r);第六章:函数(P I O 0)第七章:调试和错误解决(P 1 2 6)7.1 V isual S t u d i o 中的调试7.1.1 非中断(正常)模式下的调试输出调试信息Deb u g.W r i teLine();仅在调试模式下运营Tr a c e.WriteLi n e();可用于发布程序由S ystem.Diag n os t jc s命名空间提供1、跟踪点2、诊断输出与跟踪点(P 1 34)7.1.2 中断模式下的调试(P134)1、进入中断模式2、
25、监视变量的内容(P138)自动窗口(Au t o s)当前使用变量和前面的语句(Ctrl+D,A)局部变量(Loca Is)作用域内的所有变量(C tr 1+D,L)监视(Wa t chN)可定制的变量和表达式3、单步执行代码(P14 0)中断模式下的程序流S te p i nto:执行并移动到下一个要执行的语句上Step o v er:同上,但不进入嵌套的代码块,涉及函数S tep o u t:执行到代码块的末尾,在执行完该语句块后,重新进入中断模式4、Immediate 和 Com man d 窗口5、Call S t ack 窗口7.2错误解决(P l 43)异常1、try .c ate
26、h.finally假如有一个或多个catch块,f in a II y就是可选的,否则就是必须的。2、列出和配置异常(P 1 4 8)3、异常解决的注意事项第八章:面向对象编程简介(P15 1)8.1 什么是面向对象编程8.1.1什么是对象略为复杂的对象也许不包含任何数据,而只包含函数,表达一个过程。1、属性和字段(P153)public class ABCprivate int count;/字段public int Count扇性get return this,count;set this,count=value;属性可以控制字段的只读、可写等。2、方法8.1.2 所有的东西都是对象8.1
27、.3 对象的生命周期8.1.4 静态和实例类成员8.2 O O P 技术第九章:定义类(P16 8)第十章:定义类成员(P1 9 3)第H一章:集合、比较和转换(P222)第十四章:Wind o w s编程基础(P3 3 1)第十六章:使用通用对话框(P 4 14)16.1对话框CommonDiaolog|一I I 一 I .I -IFoideg owsetOiatog CokxDialog FontDialog PageSetupDialog Print DialogI1_OpenFileDtelog|SaveFlleDialog FormPrlmPrevlewOtalog不同对话框所合用的
28、场合1 6.2如何合用对话框CommonDia lo g 是对话框类的基类,所以所有对话框类的合用方式都是类似的。16.3文献对话框16.3.1 Op e nF i 1 eDialog(P4 1 7)O p e n F il e D i a l o g d ig =n e w O p e n F il e D i a l o g O ;d ig.S h o w D i a l o g 0 ;1、对话框的标题d ig.T it l e =O p e n F il e”;2、指定目录注意:为了获取特定的系统文献夹,可以合用Sy s t e m.En v i r o n m e n t类的静态方法G
29、etFoldPa t h(),该方法接受一个 E nv i ronm e nt.S p ecialF o Id e r 枚举成员,其中可以定义系统目录的途径。3、设立文献过滤器d ig.F il t e r =T e x t D o c u m e n t s (*.t x t)|*.t x t|A 1 1 F i le s|*.*;4、有效性验证(P419)5、帮助6、结果7、O p enFile D ialog 的属性16.3.2 Sa veF i Ie Dialog(P427)1、对话框的标题2、文献扩展名AddExte n s io n是一个布尔属性,它把文献扩展名自动添加到用户输入的
30、文献名上。其默认值是True。3、有效性验证为了自动验证文献名的有效性,应使用属性V a I i d a t e Nam e s、C heckFileE xi s ts和 C he c kPathEx i s t s。4、覆盖已有文献假如PromptC r e a te属性设立为T r u e,就会询问用户是否要创建一个新文献,假如Overw r i t eP r omp t属性设为true,就会询问用户是否真的想覆盖已有的文献。5、S a v e FileDialog 的属性第二十二章:文献系统数据(P593)22.1 流流是串行化设备的抽象表达。串行化设备可以以线性方式存储数据,并可以以同
31、样的方式访问:一次访问一个字节。有两种类型的流:输出流:当向某些外部目的写入数据时,就要用到输出流。输入流:用于将数据读到程序可以访问的内存或变量中。22.2 用于输入和输出的类F ile Stream 表达可写或可读或两者皆可的文献,此文献可以同步或异步的读写。StreamR e a d er。从流中读取字符数据,可以使用F i leSt e am创建为基类。St r eamWr i t e r。向流写入字符数据,可以使用F i 1 eStream创建为基类。22.2.1 F i Ie 和 D ir e c t ory 类F il e类的一些最常用的静态方法:方 法说 明Copy()将文件从
32、源位置复制到目标位置Creatc()在规定的路径上创建文件Delete()删除文件Open()在规定的路径上返回FileStream对象Movef)珞规定的文件移动到新位置.可以在新位置为文件规律不同的名称Directory类的一些常用的静态方法:方 法说 明CreateDirectory()创建具有规定路径的目录Delete。删除规定的目录以及其中的所有文件GetDirectories()返1可表示当前目录F的目录名的string对象数组GetFiles()返回在当前目录中的文件名的string对象数组GetFilesSystemEntriesO返何在当前目录中的文件和目录名的string对
33、象数组MoveQ将规定的目录移动到新位置.可以在新位置为文件夹规定一 个 新名称22.2.2 File I nfo 类F ileinfo类不像F ile类,它不是静态的,没有静态方法,仅可用于实例化的对象。Fileinfo对象表达磁盘或网络位置上的文献。提供文献的途径就可以创建一个Fi 1 e ln fo对象。属 性说 明Attributes使 用FileAttributes枚举,获取或者设置当前文件或目录的属性CreationTime获取当前文件的创建日期和时间Extension提取文件的扩展名。这个属性是只读的Exists判断文件是否存在,这是-一 个只读抽象属性,在Fileinfo和Di
34、rectoryinfb中进行了重写FullName检索文件的完整路径,这个属性是只读的LastAccessTime获取或设置上次访问当前文件的日期和时间LastWriteTime获取或设置上次写入当前文件的日期和时间Name检索文件的完整路径,这是 个只读抽象属件,在Filelnfb和Directoryinfb中进行了重写Directory检索一个Dir8 91y lnfb对象,表示包含当前文件的目录.这个属性是只读的DirectoryName返回文件目录的路径.这个属性是只读的IsReadOnly文件只读属性的快捷方式.这个属性也可以通过Attributes来访问Length获取文件的容量,
35、以字节为单位,返回10nt s值.这个属性是只读的注意:File I n fo对象自身不表达流。要读写文献,必须创建Stream对象。F i lelnfo对象为读写文献提供了几个返回实例化S tre a m对象的方法。22.2.3 D i recto r ylnfo 类属 性说 明Parent检索-个Directorylnfb对象,表示包含当前目录的目录这个属性是只读的Root检 索,个Directorylnfb对象,表示包含当前目录的根目录,例 如C:目录。这个属性是只读的途径名和相对途径Di rec t o ry.GetCu r ren t D i rectory。找到工作目录的当前设立D
36、 i rect o ry.S e t C u rre n tD i r ecto r y()设立新途径22.2.4 F i 1 eStr e am 对象(P5 9 8)Filestream对象表达在磁盘或网络途径上指向文献的流。这个类提供了在文献中读写字节的方法,但经常使用S t r e amRead e r或Stre a mW r it e r执行这些功能。这是由于Fil e Strea m操作的是字节和字节数组,而St r earn类操作的是字符数据。FileStream aFile=new FileStreani(myFile?FileMode.Open);Fil eStr earn a
37、File=new FileS treani GnyFile?FileMode.Open,FileAccess.ReadWrite);1、文献位置S eek()2、读取数据3、写入数据2 2.2.5 St r eamWriter 对象(P6 0 4)22.2.6 S t reamR e a der 对象FileStream aFile=new FileStream(test,txt,FileMode.Open);StreamReader sr=new StreamReader(aFile);string strReader=sr.ReadLine();while(strReader!=null)Console.Wri teLine(strReader);strReader=sr.ReadLine 0;sr.Close 0;1、读取数据读取数据最简朴的方法是Read()此方法将流的下一个字符作为正整数值返回,假如到达了流的结尾处,则返回-1。使用C onvert实用类可以把这个值转换为字符。2、用分隔符分隔的文献(P6 0 8)第二十三章:XM L(P6 28)第二十四章:数据库和A D O.NET(P6 5 5)
限制150内