C# 基础知识PPT课件_第1页
C# 基础知识PPT课件_第2页
C# 基础知识PPT课件_第3页
C# 基础知识PPT课件_第4页
C# 基础知识PPT课件_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#编程基础-C#基础知识,东软IT人才实训中心刘克刚,16.06.2020,/这是用C#编写的一个简单的HelloWorld程序usingSystem;namespaceNotepadclassHelloWorldpublicstaticvoidMain()Console.WriteLine(HelloWorld);,声明HelloWorld类,描述代码的注释,HelloWorld程序,Main函数是程序入口点,控制台类的WriteLine()方法用于显示输出结果,导入System命名空间,声明命名空间Notepad,将文件保存为hello.cs,16.06.2020,HelloWorld程

2、序,C#源文件的扩展名通常是.cs。可以使用下面的命令行调用MicrosoftC#编译器编译这个程序:cschello.cs编译后将产生一个名为hello.exe的可执行程序集。当此应用程序运行时,输出结果如下:Hello,World,16.06.2020,HelloWorld程序,配置环境变量:我的电脑-高级-环境变量-双击path,加入C:WINDOWSMicrosoft.NETFrameworkv3.5,16.06.2020,HelloWorld程序,“Hello,World”程序的开头是一个using指令,它引用了System命名空间。命名空间(namespace)提供了一种分层的方式

3、来组织C#程序和库。“Hello,World”程序中声明的Hello类只有一个成员,即名为Main的方法。Main方法是使用static修饰符声明的。按照约定,名为Main的静态方法将作为程序的入口点。该程序的输出由System命名空间中的Console类的WriteLine方法产生。此类由.NETFramework类库提供,默认情况下,MicrosoftC#编译器自动引用该类库。注意,C#语言本身不具有单独的运行时库。事实上,.NETFramework就是C#的运行时库。,16.06.2020,C#语法概述,C#代码由一系列语句组成,大部分语句都用一个分号来结束。C#是一个块结构的语言,所有

4、的语句都是代码块的一部分。这些块用花括号来界定,代码块可以包含任意多行语句,或者不包含语句。代码中的空格、回车符或tab字符(这些字符统称为空白字符),都会被C#编译器忽略。,16.06.2020,C#语法概述,C#是大小写敏感的语言。C#的注释语句:/*/:它是/语法的扩展,它们都是单行注释。在正常情况下,编译器会忽略它们,就像其他注释一样。但可以配置VS,在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件(代码的文档)。参见Helloworld示例。,16.06.2020,变量,尽管计算机中的所有数据都是相同的东西(一组0和1),但变量有不同的内涵,称为类型。建立这个类型系统

5、的原因是,不同类型的数据需要用不同的方法来处理。变量限定为不同的类型,可以避免混淆它们。例如组成数字图片的0和1序列与组成声音文件的0和1序列,其处理方式是不同的。实际上,可以使用的变量类型是无限多的。因为可以自己定义类型,存储各种复杂的数据。尽管如此,总有一些数据类型是每个人都要使用的,例如存储数值的变量。因此,C#语言有一些预定义类型。,16.06.2020,变量,语法:(访问修饰符)数据类型变量名,Public,Private,Protected,int,string,float,糖,盐,胡椒粉,盐,胡椒粉,糖,int,float,string,2,5.4,“Test”,16.06.20

6、20,变量的命名,变量名的第一个字符必须是字母、下划线或。其后的字符可以是字母、下划线或数字。最好根据变量的作用来命名它们。Hungarian记号法:在所有的变量名前加一个小写形式的前缀,表示其类型。如intiAge。但由于可以创建自己的类型,而且在.NETFramework中有上百种更复杂的类型,这种系统很快就失效了。,16.06.2020,变量的命名,目前,在.NETFramework命名空间中有两种命名约定:PascalCase:Age、LastName、WinterOfDiscontentcamelCase:age、firstName、timeOfDeathMicrosoft建议:对于

7、简单变量,使用camelCase规则,而对于复杂的命名则使用PascalCase。而使用下划线作为变量名中各个单词分隔符的做法已经淘汰了,如yet_another_variable。,16.06.2020,简单类型,这些类型中的每一种都利用了.NETFramework中定义的标准类型,使用标准类型可以在语言之间交互操作。在C#中这些类型的名称是Framework中定义的别名。例如,在C#中声明一个int时,声明的实际上是.NET的System.Int32的一个实例。这样可以把所有的基本数据类型看作是支持某些方法的类。例如,要把inti转换为string,可以编写下面的代码:strings=i.

8、ToString();应强调的是,因为.NETFramework处理这些类型的方式,获得这种语法上的便利并没有任何性能损失。,16.06.2020,简单类型:整数类型,八种整型类型分别支持8位、16位、32位和64位整数值的有符号和无符号的形式。,16.06.2020,简单类型:浮点数,可以使用的浮点数变量类型有3种:float(32位单精度)、double(64位双精度)和decimal(128位)。前两种可以用m*2e的形式存储浮点数,m和e的值随着类型的不同而不同。Decimal使用另一种形式:m*10e,适合用于财务计算和货币计算。,16.06.2020,其他简单类型,C#的bool类

9、型用于表示布尔值为true或者false的值。在C#中,字符和字符串处理使用Unicode编码。char类型表示一个UTF-16编码单元,string类型表示UTF-16编码单元的序列。组成string的字符数没有上限,因为它使用可变大小的内存。,16.06.2020,bool类型,在C+中,bool类型的值可转换为int类型的值;也就是说,false等效于零值,而true等效于非零值。在C#中,不存在bool类型与其他类型之间的相互转换。例如,下列if语句在C#中是非法的,而在C+中则是合法的:intx=123;if(x)/InvalidinC#printf_s(Thevalueofxisn

10、onzero.);若要测试int类型的变量,必须将该变量与一个值(例如零)进行显式比较,如下所示:intx=123;if(x!=0)/TheC#wayConsole.Write(Thevalueofxisnonzero.);,16.06.2020,char类型,为了面向全世界,计算机行业正在从8位字符集转向16位的Unicode模式,其中ASCII编码是一个子集。不允许在char类型与8位byte类型之间进行隐式转换。Char类型的字面值是用单引号来表示的,例如A、人。除了把char表示为字符之外,还可以用4位16进制的Unicode值(例如u0041),带有数据类型转换的整数值(例如(cha

11、r)65),或16进制数(x0041)表示它们。它们还可以包含一个转义序列,如下表所示:,16.06.2020,转义序列表,16.06.2020,值类型和引用类型,C#中的类型有两种:值类型(valuetype)和引用类型(referencetype)。值类型的变量直接包含它们的数据,存储在堆栈上。而引用类型的变量存储的是它们的数据的地址,而数据则存储在托管堆上,又称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除ref和out参数变量外),因此对一个变量的操作不可能影响另一个变量。,16.06

12、.2020,值类型和引用类型,值类型变量最大的特点是它们不能为null,总是包含一个值。而引用类型可以是null,表示它们还没有引用任何对象。要创建对象,必须使用new关键字。可以使用可空类型创建一个值类型,使值类型的行为方式类似于引用类型(即可以为null)。,16.06.2020,值类型和引用类型,C#的变量是值还是引用取决于其数据类型,比如int总是值类型,不能把int变量声明为引用(在后面介绍装箱时,可以在类型为object的引用中封装值类型。)引用类型的对象分配在堆中,其生存期可以跨越多个函数调用,可以通过一个或几个别名来访问。CLR执行一种并行算法来跟踪哪些引用变量仍需要访问,哪些

13、引用变量不需要访问了。CLR会定期进行清理,删除无效的对象,把它们占用的内存还给操作系统。把基本类型规定为值类型,而把包含许多字段的较大类型规定为引用类型,C#设计这种方式的原因是可以得到最佳性能,如果希望自定义类型是值类型,就应把它声明为结构。下表为C#类型系统的概述。,16.06.2020,16.06.2020,值类型和引用类型,例如,int是值类型,下面的代码会在内存的两个地方存储值20:inti=20;intj=i;而执行下面的代码后,只有一个MathTest对象:classMathTestpublicintvalue;MathTestx=newMathTest();x.value=3

14、0;y=x;Console.WriteLine(y.value);y.value=50;Console.WriteLine(x.value);,16.06.2020,变量的初始化,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。变量是类或结构中的字段,如果没有显式进行初始化,在默认状态下当创建这些变量时,其值就是0函数的局部变量必须在代码中显式初始化。编译器会检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生一个错误。C#的方法与C+相反,在C+中,编译器让程序员确保变量在使用之前进行了初始化,在VB中,所有的变量都会把值设置为0。,16.06.

15、2020,变量的初始化,下面的代码会产生编译错误:publicstaticintMain()intd;Console.WriteLine(d);return0;同样的规则也适用于引用类型,例如:Somethingobj;在C+中,上面的代码会在堆栈中创建Something类的一个实例。在C#中,这行代码仅会为Something对象创建一个引用,但这个引用还没有指向任何对象。调用该变量的成员会导致一个错误。在C#中实例化一个引用对象需要使用new关键字,让该引用指向存储在堆上的一个对象:Obj=newSomething();,16.06.2020,变量的作用域,变量的作用域是可以访问该变量的代码

16、区域。一般情况下,作用域的确定有以下规则:只要字段所属的类在某个作用域内,其字段也在该作用域内。局部变量存在于表示声明该变量的块语句结束的封闭花括号之前的作用域内。在for、while或类似语句中声明的局部变量存在于该循环体内。举例同名的变量不能在相同的作用域内声明两次。,16.06.2020,变量的作用域,下面的例子有什么错误?publicstaticintMain()intj=20;for(inti=0;i10;i+)intj=30;Console.WriteLine(j+i);,与第一个j冲突,编译错误,这也是与C+不同的地方,在C+中,允许隐藏变量。,16.06.2020,变量的作用域

17、,当全局变量和局部变量重复时:如果访问静态字段,需要加上类型名;如果访问实例字段,需要使用this关键字。classProgramstaticstringmyString;staticvoidMain(stringargs)stringmyString=StringdefinedinMain();Program.myString=Globalstring;Console.WriteLine(localmyString=0,myString);Console.WriteLine(globalmyString=0,Program.myString);,16.06.2020,变量的作用域,下面的代码

18、是错误的:stringtext;for(inti=0;i(右移)。对于两个布尔变量进行boolcontainRed;myColor=myColor|2;/添加绿色位myColor=myColor|4;/添加红色位containRed=(myColor它们主要用于高度优化的代码中,通常用于设备驱动程序或系统代码。,16.06.2020,使用布尔和位运算符,staticvoidMain(stringargs)Console.WriteLine(enteraninteger:);intmyInt=Convert.ToInt32(Console.ReadLine();Console.WriteLine

19、(integerlessthan10?0,myIntAdvanced-Checkforoverflow,16.06.2020,使用Convert进行显式转换,例如Convert.ToInt32(val),是把val转换为int型。使用Convert总是要进行溢出检查,checked和unchecked关键字以及项目设置没有什么作用。,16.06.2020,装箱和拆箱,C#的类型系统是统一的,因此任何类型的值都可以按对象处理。C#中的每个类型直接或间接地从object类类型派生,而object是所有类型的最终基类。引用类型的值都被当作“对象”来处理,这是因为这些值可以简单地被视为是属于objec

20、t类型。值类型的值则通过执行装箱(boxing)和拆箱(unboxing)操作亦按对象处理。下面的示例将int值转换为object,然后又转换回int。usingSystem;classTeststaticvoidMain()inti=123;objecto=i;/Boxingintj=(int)o;/Unboxing,16.06.2020,装箱和拆箱,当将值类型的值转换为类型object时,将分配一个对象实例(也称为“箱子”)以包含该值,并将值复制到该箱子中。反过来,当将一个object引用强制转换为值类型时,将检查所引用的对象是否含有正确的值类型,如果是,则将箱子中的值复制出来。C#的统一

21、类型系统实际上意味着值类型可以“按需”转换为对象。因为统一,所以使用类型object的通用库可以与引用类型和值类型一同使用。,16.06.2020,装箱和拆箱,为何需要装箱?(为何要将值类型转为引用类型?)一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。,16.06.2020,变量类型兼容的值,C#中存在几种变量(variable),包括字段、数组元素、局部变量和

22、参数。变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量,如下表所示。,16.06.2020,16.06.2020,可空类型,可以为null的类型也不必声明就可以使用。对于每个不可以为null的值类型T,都有一个相应的可以为null的类型T?,该类型可以容纳附加值null。例如,int?类型可以容纳任何32位整数或null值。用途举例?,16.06.2020,复杂类型,C#程序使用类型声明(typedeclaration)创建新类型。类型声明指定新类型的名称和成员。在C#类型分类中,有五类是用户可定义的:类类型(classtype)、结构类型(structtype)、接

23、口类型(interfacetype)、枚举类型(enumtype)和委托类型(delegatetype)。,16.06.2020,复杂变量类型:枚举,有时希望变量提取的是一个固定集合中的值。例如,orientaion类型可以存储north、south、east或west中的一个值。语法:enumtypeName:underlyingTypevalue1,value2,valueNtypeNamevarName;varName=typeName.valueN;枚举使用一个基本类型来存储(由underlyingType指定)。枚举类型的每个枚举值都存储为该基本类型的一个值,默认情况下,该类型为in

24、t,枚举的基本类型可以是byte、sbyte、short、ushort、int、uint、long和ulong枚举值,16.06.2020,枚举类型示例,enumorientation:bytenorth=1,south=2,east=3,west=4classProgramstaticvoidMain(stringargs)orientationmyDirection=orientation.north;Console.WriteLine(myDirection=0,myDirection);bytedirectionByte=(byte)myDirection;stringdirectio

25、nString=Convert.ToString(myDirection);Console.WriteLine(byteequivalent=0,directionByte);Console.WriteLine(stringequivalent=0,directionString);Console.ReadKey();,16.06.2020,枚举类型示例,即使orientation的基本类型是byte,仍需要显式类型转换:bytedirectionByte=(byte)myDirection;如果要把byte类型转换为orientation,也需要显式转换:myDirection=(orien

26、tation)myByte;需要注意并不是所有bute类型变量都可以映射为已定义的orientation值。Orientation类型可以存储其他byte值,所以不会直接产生一个错误,但违反逻辑。,16.06.2020,枚举类型示例,要获得枚举的字符串值,可以使用Convert.ToString():directionString=Convert.ToString(myDirection);是否可以使用(string)进行转换?还可以使用变量本身的ToString(),例如:directionString=myDirection.ToString();也可以把string转换为枚举值,例如:S

27、tringmyString=“north”;OrientationmyDirection=(orientation)Enum.Parse(typeof(orientation),myString);当然,并不是所有的字符串值都会映射为一个orientation值(包括大小写的区别),如果一个值不能映射为枚举值中的一个,就会产生错误。,16.06.2020,数组,声明:;可以是任何变量类型。数组必须在访问之前初始化。数组的初始化有两种方式:intmyIntArray=5,9,10,2,99;intmyIntArray=newint5;这种方式会给所有的数组元素赋予同一个默认值,对于数值类型是0。

28、以下初始化方式都是允许的:intmyIntArray=newintarraySize;intmyIntArray=newint55,9,10,2,99;,16.06.2020,数组,使用这种方式,数组大小必须与元素个数相匹配,下面的写法是错误的:intmyIntArray=newint105,9,10,2,99;如果使用变量定义其大小,该变量必须是一个常量,如:ConstintarraySize=5;intmyIntArray=newintarraySize5,9,10,2,99;,16.06.2020,数组示例,staticvoidMain(stringargs)stringfriendNames=Robert,Mike,Jeremy;Console.WriteLine(hereare0ofmyfriends:,friendNames.Length);for(inti=0;iCommandLineArguments中添加命令行参数。,16.06.2020,C#预处理指令,除了关键字外,C#还有许多预处理指令。这些命令从来不会被翻译为可执行代码中的命令,但会影响编译过程。预处理指令的开头都有符号#,结尾不需要分号。,16.06.2020,C#预处理指令,#define和#undef:例如#defineDEBUG,它告诉编译器存在给定名称的符号。这类似于声明变量,但这个变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论