C#-基础知识PPT课件

上传人:每**** 文档编号:64431260 上传时间:2022-03-21 格式:PPT 页数:108 大小:2.62MB
收藏 版权申诉 举报 下载
C#-基础知识PPT课件_第1页
第1页 / 共108页
C#-基础知识PPT课件_第2页
第2页 / 共108页
C#-基础知识PPT课件_第3页
第3页 / 共108页
资源描述:

《C#-基础知识PPT课件》由会员分享,可在线阅读,更多相关《C#-基础知识PPT课件(108页珍藏版)》请在装配图网上搜索。

1、Copyright 2009 By Neusoft Group. All rights reserved.Copyright 2009 By Neusoft Group. All rights reserved.C#编程基础编程基础-C#基础知识基础知识东软IT人才实训中心 刘克刚2021/6/7/这是用 C# 编写的一个简单的 HelloWorld 程序using System;namespace Notepadclass HelloWorldpublic static void Main()Console.WriteLine(Hello World);声明 HelloWorld 类描述代码

2、的注释Hello World 程序程序Main函数是程序入口点控制台类的 WriteLine() 方法用于显示输出结果导入 System 命名空间声明命名空间 Notepad将文件保存为 hello.cs2021/6/7Hello World 程序程序C# 源文件的扩展名通常是 .cs。可以使用下面的命令行调用 Microsoft C# 编译器编译这个程序:csc hello.cs编译后将产生一个名为 hello.exe 的可执行程序集。当此应用程序运行时,输出结果如下:Hello, World2021/6/7Hello World 程序程序配置环境变量:我的电脑-高级-环境变量-双击path

3、,加入C:WINDOWSMicrosoft.NETFrameworkv3.52021/6/7Hello World 程序程序“Hello, World”程序的开头是一个using指令,它引用了System 命名空间。命名空间(namespace)提供了一种分层的方式来组织C#程序和库。“Hello, World”程序中声明的Hello类只有一个成员,即名为 Main 的方法。Main方法是使用static修饰符声明的。按照约定,名为Main的静态方法将作为程序的入口点。该程序的输出由System命名空间中的Console类的WriteLine方法产生。此类由.NET Framework类库提供

4、,默认情况下,Microsoft C#编译器自动引用该类库。注意,C#语言本身不具有单独的运行时库。事实上,.NET Framework就是C#的运行时库。2021/6/7C#语法概述语法概述C#代码由一系列语句组成,大部分语句都用一个分号来结束。C#是一个块结构的语言,所有的语句都是代码块的一部分。这些块用花括号来界定,代码块可以包含任意多行语句,或者不包含语句。代码中的空格、回车符或tab字符(这些字符统称为空白字符),都会被C#编译器忽略。2021/6/7C#语法概述语法概述C#是大小写敏感的语言。C#的注释语句:/*/:它是/语法的扩展,它们都是单行注释。在正常情况下,编译器会忽略它们

5、,就像其他注释一样。但可以配置VS,在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件(代码的文档)。参见Hello world示例。2021/6/7变量变量尽管计算机中的所有数据都是相同的东西(一组0和1),但变量有不同的内涵,称为类型。建立这个类型系统的原因是,不同类型的数据需要用不同的方法来处理。变量限定为不同的类型,可以避免混淆它们。例如组成数字图片的0和1序列与组成声音文件的0和1序列,其处理方式是不同的。实际上,可以使用的变量类型是无限多的。因为可以自己定义类型,存储各种复杂的数据。尽管如此,总有一些数据类型是每个人都要使用的,例如存储数值的变量。因此,C#语言有一些

6、预定义类型。2021/6/7变量变量语法:(访问修饰符访问修饰符) 数据类型数据类型 变量名变量名PublicPrivateProtectedintstringfloat糖糖盐盐胡椒粉胡椒粉盐胡椒粉糖intfloatstring25.4“Test”2021/6/7变量的命名变量的命名变量名的第一个字符必须是字母、下划线或。其后的字符可以是字母、下划线或数字。最好根据变量的作用来命名它们。Hungarian记号法:在所有的变量名前加一个小写形式的前缀,表示其类型。如int iAge。但由于可以创建自己的类型,而且在.NET Framework中有上百种更复杂的类型,这种系统很快就失效了。2021

7、/6/7变量的命名变量的命名目前,在.NET Framework命名空间中有两种命名约定:PascalCase:Age、LastName、WinterOfDiscontentcamelCase:age、firstName、timeOfDeathMicrosoft建议:对于简单变量,使用camelCase规则,而对于复杂的命名则使用PascalCase。而使用下划线作为变量名中各个单词分隔符的做法已经淘汰了,如yet_another_variable。2021/6/7简单类型简单类型这些类型中的每一种都利用了.NET Framework中定义的标准类型,使用标准类型可以在语言之间交互操作。在C#

8、中这些类型的名称是Framework中定义的别名。例如,在C#中声明一个int时,声明的实际上是.NET的System.Int32的一个实例。这样可以把所有的基本数据类型看作是支持某些方法的类。例如,要把int i转换为string,可以编写下面的代码:string s = i.ToString();应强调的是,因为.NET Framework处理这些类型的方式,获得这种语法上的便利并没有任何性能损失。2021/6/7简单类型:整数类型简单类型:整数类型八种整型类型分别支持8位、16位、32位和64位整数值的有符号和无符号的形式。2021/6/7简单类型:浮点数简单类型:浮点数可以使用的浮点数

9、变量类型有3种:float(32位单精度)、double(64位双精度)和decimal(128位)。前两种可以用m*2e的形式存储浮点数,m和e的值随着类型的不同而不同。Decimal使用另一种形式:m*10e ,适合用于财务计算和货币计算。2021/6/7其他简单类型其他简单类型C#的bool类型用于表示布尔值 为true或者false的值。在C#中,字符和字符串处理使用Unicode编码。char类型表示一个UTF-16编码单元,string类型表示UTF-16编码单元的序列。组成string的字符数没有上限,因为它使用可变大小的内存。2021/6/7bool类型类型在C+中,boolb

10、ool类型的值可转换为intint类型的值;也就是说,falsefalse等效于零值,而truetrue等效于非零值。在C#中,不存在 boolbool类型与其他类型之间的相互转换。例如,下列ifif语句在C# 中是非法的,而在C+中则是合法的:int x = 123; if (x) / Invalid in C# printf_s(The value of x is nonzero.); 若要测试 intint 类型的变量,必须将该变量与一个值(例如零)进行显式比较,如下所示:int x = 123; if (x != 0) / The C# way Console.Write(The va

11、lue of x is nonzero.);2021/6/7char类型类型为了面向全世界,计算机行业正在从8位字符集转向16位的Unicode模式,其中ASCII编码是一个子集。不允许在char类型与8位byte类型之间进行隐式转换。Char类型的字面值是用单引号来表示的,例如A、人。除了把char表示为字符之外,还可以用4位16进制的Unicode值(例如u0041),带有数据类型转换的整数值(例如(char)65),或16进制数(x0041)表示它们。它们还可以包含一个转义序列,如下表所示:2021/6/7转义序列表转义序列表2021/6/7值类型和引用类型值类型和引用类型C#中的类型有

12、两种:值类型(value type)和引用类型 (reference type)。值类型的变量直接包含它们的数据,存储在堆栈上。而引用类型的变量存储的是它们的数据的地址,而数据则存储在托管堆上,又称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除 ref 和 out 参数变量外),因此对一个变量的操作不可能影响另一个变量。2021/6/7值类型和引用类型值类型和引用类型值类型变量最大的特点是它们不能为null,总是包含一个值。而引用类型可以是null,表示它们还没有引用任何对象。要创建对象,必须

13、使用new关键字。可以使用可空类型创建一个值类型,使值类型的行为方式类似于引用类型(即可以为null)。2021/6/7值类型和引用类型值类型和引用类型C#的变量是值还是引用取决于其数据类型,比如int总是值类型,不能把int变量声明为引用(在后面介绍装箱时,可以在类型为object的引用中封装值类型。)引用类型的对象分配在堆中,其生存期可以跨越多个函数调用,可以通过一个或几个别名来访问。CLR执行一种并行算法来跟踪哪些引用变量仍需要访问,哪些引用变量不需要访问了。CLR会定期进行清理,删除无效的对象,把它们占用的内存还给操作系统。把基本类型规定为值类型,而把包含许多字段的较大类型规定为引用类

14、型,C#设计这种方式的原因是可以得到最佳性能,如果希望自定义类型是值类型,就应把它声明为结构。下表为C#类型系统的概述。2021/6/7类别类别说明说明值类型简单类型有符号整型:sbyte、short、int 和 long无符号整型:byte、ushort、uint 和 ulongUnicode 字符型:charIEEE 浮点型:float 和 double高精度小数型:decimal布尔型:bool枚举类型enum E . 形式的用户定义的类型结构类型struct S . 形式的用户定义的类型可以为 null 的类型其他所有具有 null 值的值类型的扩展引用类型类类型其他所有类型的最终基类

15、:objectUnicode 字符串型:stringclass C . 形式的用户定义的类型接口类型interface I . 形式的用户定义的类型数组类型一维和多维数组,例如 int 和 int,委托类型例如,delegate int D(.) 形式的用户定义的类型2021/6/7值类型和引用类型值类型和引用类型例如,int是值类型,下面的代码会在内存的两个地方存储值20:int i = 20;int j = i;而执行下面的代码后,只有一个MathTest对象:class MathTest public int value;MathTest x = new MathTest();x.val

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

17、置为0。2021/6/7变量的初始化变量的初始化下面的代码会产生编译错误:public static int Main()int d;Console.WriteLine(d);return 0;同样的规则也适用于引用类型,例如:Something obj;在C+中,上面的代码会在堆栈中创建Something类的一个实例。在C#中,这行代码仅会为Something对象创建一个引用,但这个引用还没有指向任何对象。调用该变量的成员会导致一个错误。在C#中实例化一个引用对象需要使用new关键字,让该引用指向存储在堆上的一个对象:Obj = new Something();2021/6/7变量的作用域变

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

19、地方,在C+中,允许隐藏变量。2021/6/7变量的作用域变量的作用域当全局变量和局部变量重复时:如果访问静态字段,需要加上类型名;如果访问实例字段,需要使用this关键字。class Program static string myString; static void Main(string args) string myString = String defined in Main(); Program.myString = Global string; Console.WriteLine(local myString = 0, myString); Console.WriteLine(

20、global myString = 0, Program.myString); 2021/6/7变量的作用域变量的作用域下面的代码是错误的:string text;for(int i=0; i10; i+) text = line + Convert.ToString(i); Console.WriteLine(0, text);修改: string text = “”;只声明一个简单的变量类型,并不会引起什么变化。只有在给变量赋值后,这个值才占用一块内存空间。上面的例子中,占据内存空间的行为在循环中发生,该值实际上定义为一个局部值,在循环的外部会超出了其作用域。2021/6/7常量常量在声明

21、和初始化变量时,在变量的前面加上const关键字,就可以把该变量指定为一个常量。常量是其值在使用过程中不会发生变化的变量。例如:const int a = 100;在C+中,const有很多的用法。但在C#中,只能把局部变量和字段声明为常量。2021/6/7常量的特征常量的特征常量必须在声明时初始化。指定了其值后,不能再修改。常量的值必须能在编译时计算出来。因此,不能用从一个变量中提取的值来初始化常量。除非是只读字段。常量总是静态的,但不允许再常量声明中包含static。2021/6/7使用常量的好处使用常量的好处常量用易于理解的清楚的名称替代了“含义不明确的数字或字符串”,使程序易于阅读。常

22、量使程序易于修改。常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,编译器就会报错。2021/6/7简单类型示例简单类型示例static void Main(string args) int myInteger; string myString; myInteger = 17; myString = myInteger is; Console.WriteLine(0 1., myString, myInteger); Console.ReadKey(); 的作用?2021/6/7简单类型示例简单类型示例WriteLine的第一个参数实际上是插入变量内容的一个模板,字符串中的每对

23、花括号都是一个占位符。把文本输出到控制台时,每个占位符就会用对应的变量来替代。所有的转义序列都包含一个反斜杠,后跟一个字符组合。2021/6/7字面值常量字面值常量比如:像100这样的值,在程序中当做字面常量(literal constant),称之为字面值是因为只能用它的值称呼它,称之为常量是因为他的值不能被修改。每个字面值常量都有一个类型,只有内置类型存在字面值。自定义类型不存在字面值。可以在字面值常量字面值常量的后面添加一些字符,指定想要的类型。一些常量值有多种类型,在编译时由编译器根据它们的上下文确定其类型。16进制的整数字面值需要以0 x开头。2021/6/7字面值常量表字面值常量表

24、2021/6/7object类型类型object(System.Object):根类型,CTS中的其他类型都是从它派生而来的(包括值类型)。许多编程语言和类结构都提供了一个根类型,C#和.NET也不例外。在C#中,object是所有预定义类型和自定义类型的最终父类。这样,object类型就可以用于两个目的:可以使用object引用绑定任何特定子类型的对象。例如可以利用object类型把堆栈中的一个值对象装箱,再移动到堆中。对象引用也可以用于反射,此时必须有代码处理未知的特定类型对象。类似于C+中void指针或VB中的Variant数据类型。Object类型执行许多基本的一般用途的方法,包括Eq

25、ual()、GetHashCode()、GetType()、ToString()。用户定义的类型要想与其他类协调工作,需要重写这些方法。比如,重写ToString(),该方法可以提供类本身的字符串表示。2021/6/7string类型类型C#提供了自己的string类型。有了它,像字符串连接和字符串复制这样的操作就很简单了:String s1 = “Hello ”;String s2 = “world”;String s3 = s1 + s2;尽管这是一个值字样的赋值,但CTS System.String是一个引用类型。String对象保留在堆上,而不是堆栈上。但string是有“值”特征的“

26、引用”类型。当把一个字符串变量赋给另一个字符串变量时,会得到对内存中同一个字符串的两个引用。然后,修改其中一个字符串,会创建一个全新的string对象,而另一个字符串没有改变。2021/6/7string类型类型考虑如下代码:string s1=1234567890; string s2=s1; Console.WriteLine(s1.Equel(s2); /返回true string s1=1234567890; string s2=s1; s2=888888; Console.WriteLine(s1.Equel(s2); /返回false 2021/6/7string类型类型字符串字面

27、值放在双引号中。C#字符串和char一样,可以包含Unicode、16进制数转义序列。下面两种写法是等价的:“Karlis string.”“Karliu0027s string.”如果字符串中有反斜杠,则需要用”来表示它。string filepath = “c:procsharpfirst.cs”;也可以逐字地指定字符串,即两个双引号之间的所有字符都包含在字符串中,包括行末字符和需要转义的字符。唯一的例外是双引号字符的转义,它们必须指定,以避免结束字符串。”Verbatim string literal.”c:tempmyDirmyfile.doc”A short list:item 1i

28、tem 2”2021/6/7字符串处理字符串处理string类型变量可以看作是char变量的只读数组。如下方式可以获得一个可写的char数组:string myString = “A string”;char myChar2 = myString.ToCharArray();string的常用成员:string.Lengthstring.ToLower()string.ToUpper()string.Trim()string.PadLeft()string.PadRight()string.Split()2021/6/7表达式表达式表达式(expression)由操作数(operand)和运算

29、符(operator)构成。表达式的运算符指示对操作数适用什么样的运算。运算符例如+、-、*、/、new等。操作数例如字面值(literal)、字段、局部变量、表达式等。当表达式包含多个运算符时,运算符的优先级(precedence) 控制各运算符的计算顺序。例如,表达式 x + y * z 按 x + (y * z) 计算,因为 * 运算符的优先级高于 + 运算符。大多数运算符都可以重载(overload)。运算符重载允许指定用户定义的运算符实现来执行运算,这些运算的操作数中至少有一个,甚至所有都属于用户定义的类类型或结构类型。下表总结了C#运算符,并按优先级从高到低的顺序列出各运算符类别。

30、同一类别中的运算符优先级相同。2021/6/7类别类别表达式表达式说明说明基本x.m成员访问x(.)方法和委托调用x.数组和索引器访问x+后增量x-后减量new T(.) 对象和委托创建new T(.).使用初始值设定项创建对象new .匿名对象初始值设定项new T. 数组创建typeof(T)获得 T 的 System.Type 对象checked(x) 在 checked 上下文中计算表达式unchecked(x)在 unchecked 上下文中计算表达式default(T) 获取类型 T 的默认值2021/6/7一元+x恒等-x求相反数!x逻辑求反x按位求反+x前增量-x前减量(T)x

31、显式将 x 转换为类型 T乘除x * y乘法x / y除法x % y求余加减x + y加法、字符串串联、委托组合x y减法、委托移除2021/6/7移位x y右移关系和类型检测x y大于x = y大于或等于x is T如果 x 属于 T 类型,则返回 true,否则返回 falsex as T返回转换为类型 T 的 x,如果 x 不是 T 则返回 null相等x = y等于x != y不等于2021/6/7逻辑 ANDx & y整型按位 AND,布尔逻辑 AND逻辑 XORx y整型按位 XOR,布尔逻辑 XOR逻辑 ORx | y整型按位 OR,布尔逻辑 OR条件 ANDx & y仅当 x

32、为 true 才对 y 求值条件 ORx | y仅当 x 为 false 才对 y 求值空合并X ? y如果 x 为 null,则对 y 求值,否则对 x 求值条件x ? y : z如果 x 为 true,则对 y 求值,如果 x 为 false,则对 z 求值赋值或匿名函数x = y赋值x op= y复合赋值;支持的运算符有:*= /= %= += -= = &= = |=(T x) = y匿名函数(lambda 表达式)2021/6/7运算符运算符is运算符:检查对象是否与特定的类型兼容。“兼容”是指对象是该类型或者派生于该类型。例如,要检查变量是否与object兼容:int i = 10

33、;if(i is object)Console.WriteLine(“i is an object”);as运算符用于执行显式的类型转换。例如:2021/6/7运算符运算符sizeof运算符:使用sizeof运算符运算符可以确定堆栈中值类型需要的长度(字节数),只能在不安全代码中使用sizeof运算符。例如:string s = “ab”;unsafeConsole.WriteLine(sizeof(int);Typeof运算符:Typeof运算符返回一个表示特定类型的Type对象。例如Typeof(string)返回表示System.String类型的Type对象。在使用反射动态查找对象的信

34、息时,这个运算符是很有效的。2021/6/7位运算位运算位运算符包括:&(按位与)、|(按位或)、(异或)、(按位取反)、(右移)。对于两个布尔变量进行&操作和&操作的结果是等同的。但后者的性能比较好。因为它检查第一个操作数的值,再根据该操作数的值进行操作,可能根本不需要第二个操作数的值。但前者的操作数总是要计算的。整数存储在.NET中的方式称为2的补位,(-x)定义为(x+1),这个系统在把数字加起来时非常有用。例如,把10和-5加起来就得到5。为什么1=-2 ?2021/6/7位运算举例位运算举例位运算在某些情况下是非常有用的,因为它们可以用变量中的各个位存储信息。例如,颜色可以使用3个位

35、来指定红、绿、蓝。可以分别设置这些位,表示多种颜色。2021/6/7位运算举例位运算举例int myColor = 0;bool containRed;myColor = myColor | 2;/添加绿色位myColor = myColor | 4;/添加红色位containRed = (myColor & 4) = 4;/检查红色位左移运算符int var1, var2=10, var3=2;var1 = var2 int var1, var2 = 10;var1 = var2 1;它们主要用于高度优化的代码中,通常用于设备驱动程序或系统代码。2021/6/7使用布尔和位运算符使用布尔和位

36、运算符static void Main(string args) Console.WriteLine(enter an integer:); int myInt = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(integer less than 10? 0, myInt 10); Console.WriteLine(integer between 0 and 5? 0, (0 = myInt) & (myInt = 5); Console.WriteLine(bitwise and of integer and 10=0, myI

37、nt & 10); Console.ReadKey();2021/6/7语句语句程序的操作是使用语句(statement)来表示的。C#支持几种不同的语句,其中许多以嵌入语句的形式定义。块(block)用于在只允许使用单个语句的上下文中编写多条语句。块由位于一对大括号 之间的语句列表组成。声明语句(declaration statement)用于声明局部变量和常量。表达式语句(expression statement)用于对表达式求值。可用作语句的表达式包括方法调用、使用 new 运算符的对象分配、使用=和复合赋值运算符的赋值,以及使用+和-运算符的增量和减量运算。选择语句 selection

38、 statement)用于根据表达式的值从若干个给定的语句中选择一个来执行。这一组语句有if和switch语句。2021/6/7语句语句迭代语句(iteration statement)用于重复执行嵌入语句。这一组语句有 while、do、for 和 foreach 语句。跳转语句(jump statement)用于转移控制。这一组语句有 break、continue、goto、throw、return 和 yield 语句。try.catch语句用于捕获在块的执行期间发生的异常,try.finally语句用于指定终止代码,不管是否发生异常,该代码都始终要执行。checked语句和unchec

39、ked语句用于控制整型算术运算和转换的溢出检查上下文。lock语句用于获取某个给定对象的互斥锁,执行一个语句,然后释放该锁。using语句用于获得一个资源,执行一个语句,然后释放该资源。2021/6/7C#语句示例语句示例语句语句示例示例局部变量声明static void Main() int a; int b = 2, c = 3; a = 1;Console.WriteLine(a + b + c);局部常量声明static void Main() const float pi = 3.1415927f;const int r = 25;Console.WriteLine(pi * r *

40、 r);表达式语句static void Main() int i;i = 123; / Expression statementConsole.WriteLine(i);/ Expression statementi+;/ Expression statementConsole.WriteLine(i);/ Expression statement2021/6/7if 语句static void Main(string args) if (args.Length = 0) Console.WriteLine(No arguments);else Console.WriteLine(One o

41、r more arguments);switch 语句static void Main(string args) int n = args.Length;switch (n) case 0:Console.WriteLine(No arguments);break;case 1:Console.WriteLine(One argument);break;default:Console.WriteLine(0 arguments, n);break;2021/6/7while 语句static void Main(string args) int i = 0;while (i args.Leng

42、th) Console.WriteLine(argsi);i+;do 语句static void Main() string s;do s = Console.ReadLine();if (s != null) Console.WriteLine(s); while (s != null);for 语句static void Main(string args) for (int i = 0; i args.Length; i+) Console.WriteLine(argsi);2021/6/7foreach 语句static void Main(string args) foreach (s

43、tring s in args) Console.WriteLine(s);break 语句static void Main() while (true) string s = Console.ReadLine();if (s = null) break;Console.WriteLine(s);continue 语句static void Main(string args) for (int i = 0; i args.Length; i+) if (argsi.StartsWith(/) continue;Console.WriteLine(argsi);2021/6/7goto 语句st

44、atic void Main(string args) int i = 0;goto check;loop:Console.WriteLine(argsi+);check:if (i args.Length) goto loop;return 语句static int Add(int a, int b) return a + b;static void Main() Console.WriteLine(Add(1, 2);return;2021/6/7yield 语句static IEnumerable Range(int from, int to) for (int i = from; i

45、balance) throw new Exception(Insufficient funds);balance -= amount;using 语句static void Main() using (TextWriter w = File.CreateText(test.txt) w.WriteLine(Line one);w.WriteLine(Line two);w.WriteLine(Line three);2021/6/7类型转换类型转换尽管所有的数据都是由0和1组成,但不同类型的变量使用不同的模式来表示数据。所以存储方式不同的类型之间需要类型转换。隐式转换:从类型A到类型B的转换可

46、以在所有情况下进行,转换规则非常简单,可以让编译器进行。显式转换:从类型A到类型B的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的处理。隐式转换规则:任何类型A,只有其取值范围完全包含在B的取值范围内,就可以隐式转换为类型B。下表列出了编译器可以隐式执行的数值转换:2021/6/72021/6/7显式转换显式转换语法:(destinationType)sourceVar这只在某些情况下是可行的。彼此之间没有什么关系的类型不能进行数据类型转换。例如:short sourceVar = 7;byte destinationVar = (byte)sourceVar;如果source

47、Var的值为281呢?2021/6/7显式转换显式转换解决转换溢出的一种方式是简单地检查源变量的值,把它与目标变量的取值范围进行比较。还有另一个技术,迫使系统检查运行期间是否发生转换溢出。checked(expression)unchecked(expression)执行下面的代码,会发生什么?short sourceVar = 281;byte destinationVar = checked(byte)sourceVar);还可以配置应用程序,让这种类型的表达式都包含checked关键字,除非表达式明确使用unchecked关键字。项目属性-Build-Advanced-Check for

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

49、)操作亦按对象处理。下面的示例将 int 值转换为 object,然后又转换回 int。using System;class Teststatic void Main() int i = 123;object o = i;/ Boxingint j = (int)o;/ Unboxing2021/6/7装箱和拆箱装箱和拆箱当将值类型的值转换为类型 object 时,将分配一个对象实例(也称为“箱子”)以包含该值,并将值复制到该箱子中。反过来,当将一个 object 引用强制转换为值类型时,将检查所引用的对象是否含有正确的值类型,如果是,则将箱子中的值复制出来。C# 的统一类型系统实际上意味着值

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

51、ble),包括字段、数组元素、局部变量和参数。变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量,如下表所示。2021/6/7变量类型变量类型可能的内容可能的内容不可以为 null 的值类型类型完全相同的值可以为 null 的值类型null 值或类型完全相同的值object空引用、对任何引用类型的对象的引用,或对任何值类型的装箱值的引用类类型空引用、对该类类型的实例的引用,或者对从该类类型派生的类的实例的引用接口类型空引用、对实现该接口类型的类类型的实例的引用,或者对实现该接口类型的值类型的装箱值的引用数组类型空引用、对该数组类型的实例的引用,或者对兼容数组类型的实例的

52、引用委托类型空引用或对该委托类型的实例的引用2021/6/7可空类型可空类型可以为 null 的类型也不必声明就可以使用。对于每个不可以为 null 的值类型 T,都有一个相应的可以为 null 的类型 T?,该类型可以容纳附加值 null。例如,int? 类型可以容纳任何 32 位整数或 null 值。用途举例?2021/6/7复杂类型复杂类型C#程序使用类型声明 (type declaration) 创建新类型。类型声明指定新类型的名称和成员。在 C# 类型分类中,有五类是用户可定义的:类类型 (class type)、结构类型 (struct type)、接口类型 (interface

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

54、型为int,枚举的基本类型可以是byte、sbyte、short、ushort、int、uint、long和ulong枚举值2021/6/7枚举类型示例枚举类型示例enum orientation : byte north = 1, south = 2, east = 3, west = 4class Program static void Main(string args) orientation myDirection = orientation.north; Console.WriteLine(myDirection = 0, myDirection); byte directionBy

55、te = (byte)myDirection; string directionString = Convert.ToString(myDirection); Console.WriteLine(byte equivalent = 0, directionByte); Console.WriteLine(string equivalent = 0, directionString); Console.ReadKey(); 2021/6/7枚举类型示例枚举类型示例即使orientation的基本类型是byte,仍需要显式类型转换: byte directionByte = (byte)myDir

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

57、例如: directionString = myDirection.ToString();也可以把string转换为枚举值,例如:String myString = “north”;Orientation myDirection = (orientation)Enum.Parse(typeof(orientation),myString);当然,并不是所有的字符串值都会映射为一个orientation值(包括大小写的区别),如果一个值不能映射为枚举值中的一个,就会产生错误。2021/6/7数组数组声明: ;可以是任何变量类型。数组必须在访问之前初始化。数组的初始化有两种方式:int myInt

58、Array = 5, 9, 10, 2, 99;int myIntArray = new int5;这种方式会给所有的数组元素赋予同一个默认值,对于数值类型是0。以下初始化方式都是允许的:int myIntArray = new intarraySize;int myIntArray = new int5 5, 9, 10, 2, 99; 2021/6/7数组数组使用这种方式,数组大小必须与元素个数相匹配,下面的写法是错误的:int myIntArray = new int10 5, 9, 10, 2, 99;如果使用变量定义其大小,该变量必须是一个常量,如:Const int arraySi

59、ze = 5;int myIntArray = new intarraySize 5, 9, 10, 2, 99;2021/6/7数组示例数组示例static void Main(string args) string friendNames = Robert, Mike, Jeremy; Console.WriteLine(here are 0 of my friends:, friendNames.Length); for (int i = 0; i friendNames.Length; i+ ) Console.WriteLine(friendNamesi); Console.Read

60、Key();注意:防止for循环下标越界。2021/6/7foreach循环循环foreach循环可以使用一种简便的语法定位数组中的每个元素foreach( in )/can use for each elementforeach循环不存在访问非法元素的危险。foreach(string friendName in friendNames)Console.WriteLine(friendName);foreach循环和for循环的主要区别是foreach循环对数组内容进行只读访问,所以不能改变任何元素的值。例如:foreach(string friendName in friendNames)

61、friendName = “rupert”;2021/6/7多维数组多维数组二维数组声明:, ;多维数组只需要更多的逗号:, ;赋值也使用类似的语法:double, hillHeight = new double3,4;double, hillHeight = 1, 2, 3, 4,2, 3, 4, 5, 3, 4, 5, 6;要访问多维数组中的元素,只需指定它们的下标,并用逗号分隔开,例如: hillHeight2,1Foreach循环可以访问多维数组中的所有元素(行优先顺序),方式与访问一维数组相同。foreach(double height in hillHeight)Console.W

62、riteLine(“0”, height);2021/6/7数组的数组数组的数组也称为变长数组,其中每行都有不同的元素个数。声明:int jaggedIntArray;初始化1:jaggedIntArray = new int2;jaggedIntArray0 = new int3;jaggedIntArray1 = new int4;初始化2:jaggedIntArray = new int3new int1,2,3, new int1, new int1,2;int jaggedIntArray = new int1,2,3, new int1, new int1,2;2021/6/7数组

63、的数组数组的数组对于变长数组可以使用foreach循环,但通常需要嵌套该循环,例如:foreach(int array in jaggedIntArray)foreach(int element in array)Console.WriteLine(element);2021/6/7函数函数语法static ( , )return ;如果返回值非空,所有的分支路径都必须有return语句。static double GetVal() double d = 3.0; if (d 5) return 2 * d;2021/6/7函数函数在调用函数时,必须使参数与函数定义中指定的参数完全匹配,包括类

64、型、个数和顺序。示例:利用函数调用找到整型数组中最大的元素。class Program static int MaxValue(int intArray) int maxVal = intArray0; for(int i=1; i maxVal) maxVal = intArrayi; return maxVal; static void Main(string args) int myArray = 1, 8, 3, 6, 2, 5, 9, 3, 0, 2; int maxVal = MaxValue(myArray); Console.WriteLine(The maximum valu

65、e in myArray is 0, maxVal); Console.ReadKey(); 2021/6/7参数数组参数数组C#允许为函数指定一个(只能指定一个)特定的参数,且这个参数必须是最后一个参数,称为参数数组。参数数组可以使用个数不定的参数调用函数,它可以使用params关键字来定义。比如:string GetWord(string s, params int vals)String word = GetWord(“this is a sentence”, 2);String word = GetWord(“this is a sentence”, 4, 3);GetWord定义了一

66、个参数数组,调用它的时候除了第一个参数外,可以传任意多个int型的参数(也可以不传)。第一次调用表示获得第2个单词,结果word为”is”;第二次调用表示获得第4个单词的前3个字符,结果word为”sen”。2021/6/7引用参数和值参数引用参数和值参数static void showDouble(int val) val *= 2; Console.WriteLine(val doubled = 0, val);static void Main(string args) int myNumber = 5; Console.WriteLine(myNumber = 0, myNumber); showDouble(myNumber); Console.WriteLine(myNumber = 0, myNumber);输出结果?2021/6/7引用参数和值参数引用参数和值参数static void showDouble(ref int val) val *= 2; Console.WriteLine(val doubled = 0, val);showDouble(ref myNum

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!