《第3章C编程基础.ppt》由会员分享,可在线阅读,更多相关《第3章C编程基础.ppt(85页珍藏版)》请在三一办公上搜索。
1、2010.07,第3章 C#编程基础,学习要点,1.了解C#程序的一般结构、标识符的命名规则以及C#关键字2.理解C#常用的简单值类型、复合值类型,了解C#的引用类型3.掌握不同数据类型之间的转换,理解装箱和拆箱的概念4.掌握常量和变量的概念及数组的声明和使用方法5.掌握运算符和表达式的概念以及常用流程控制语句的使用,3.1 一个简单的C#程序设计,【示例代码:chpt3-1a MyFirstProgram】(1)在Visual Studio 2005中新建一个C#控制台应用程序项目。(2)在代码编辑器中编写控制台应用程序的源代码文件Program.cs,其代码(注意C#语言严格区分大小写字母
2、)如下:using System;using System.Collections.Generic;using System.Text;namespace MyFirstProgram class Program static void Main(string args)/设置控制台窗口的标题 Console.Title=例chpt3-a;Console.WriteLine(C#语言程序设计n一个简单的控制台程序);Console.Read();,3.1 一个简单的C#程序设计,(3)按下键或选中“调试”“启动调试”菜单命令编译并运行此程序。其结果如图所示。我们还可以在其他开发环境中编辑运行这
3、个C#程序。下面我们对这个程序进行简要分析。,3.1 一个简单的C#程序设计,3.1.1 命名空间 程序中经常要定义很多类和方法,为了便于组织和管理,C#语言引入了命名空间(namespace)的概念。命名空间相当于一个容器,它包含一组定义的类或结构,命名空间也可以嵌套在另一个命名空间中,就像文件目录一样。using System;using System.Collections.Generic;using System.Text;.NET 类库提供了很多类,根据类的功能不同,又划分了很多命名空间,而这些命名空间大多数有一个顶级的命名空间 System,Text 和Collections.Ge
4、neric都是其下嵌套的命名空间。,3.1 一个简单的C#程序设计,要调用命名空间下的某个类提供的方法,可以使用下面的语法:命名空间.命名空间.命名空间.实例名称.方法名(参数,);例如:System.Console.WriteLine(我的第一个C#程序);在C#应用程序中,一般在程序的开头使用关键字using来引入命名空间:using 命名空间;然后就可以自由的使用名称空间下的各种类。比如前面的例子就是在程序的开始时写了:using System;因此,在后续程序中就可以直接写:Console.WriteLine(我的第一个C#程序);用户也可以使用关键字namespace创建自定义的命名
5、空间:namespace 命名空间名;,3.1 一个简单的C#程序设计,3.1 一个简单的C#程序设计,3.1.2 Main方法 每个应用程序包含了很多的方法,但执行必须有一个起点,也叫入口点,C#规定入口点的方法名必须为Main!示例程序中的第8行定义了该程序的入口方法:static void Main(string args)其中,static表示该方法是静态的,void表示该方法没有返回值。Main方法的返回值只能是void类型或int类型。int类型的返回值表示应用程序结束时的终止状态代码,0表示成功返回,非0值表示错误异常编号。void类型则没有返回值。每个C#控制台和Windows
6、应用程序中,必须有一个类包含名为Main的静态方法。如果有多个类都定义了Main方法,则必须指定其中一个为主方法作为入口点。,3.1 一个简单的C#程序设计,3.1.3 程序代码注释 C#语言中常规的注释方法有两种:1.单行注释 以“/”符号开始,本行中任何位于“/”之后的字符都是注释信息。2.多行注释 以“/*”作为注释的开始,以“*/”作为注释的结束。在“/*”和“*/”之间的所有文字都是注释信息。例如:/*这是多行注释,上下共三行*/在Visual C#中最有特点的是可以使用 XML 的格式添加注释。,3.1 一个简单的C#程序设计,3.1.4 控制台的输入与输出 在Windows操作系
7、统中,控制台应用程序的输入输出是通过命令提示符窗口进行的。用户可以在程序中调用方法向命令提示符窗口输出文本,也可以调用方法从命令提示符窗口读取一行或一个来自键盘输入的字符。主要通过Console类完成控制台的输入输出功能。例如示例程序中:Console.WriteLine(C#语言程序设计n一个简单的控制台程序);Console.Read();,3.1 一个简单的C#程序设计,1.控制台输入 C#语言在Console类中提供了三种公共方法从命令提示符窗口获取输入:Read()、ReadKey()和ReadLine()。Console.Read()方法从命令提示符窗口获取一个字符的整数形式,它所
8、对应的数据类型是int类型,遇到“Enter”键时终止。要获得实际的字符,就需要将得到的整数形式转换成字符。int code;char character;code=Console.Read();/输入字母r,code=114 character=(char)code;/将整数转换成字符,3.1 一个简单的C#程序设计,Console.ReadLine()方法Console.Read()方法从命令提示符窗口获取一行字符串,直到遇到“Enter”键时终止,返回数据类型是string类型,如果要获得int类型或double类型的数值,就需要进行转换。string name,AgeString;in
9、t Age;/获取姓名,赋给字符串类型变量name name=Console.ReadLine();/获取年龄,赋给字符串类型变量AgeString AgeString=Console.ReadLine();/使用年龄前,需将字符串类型转换成整数类型 Age=Conver.ToInt32(AgeString);,3.1 一个简单的C#程序设计,Console.ReadKey()方法获取用户按下的一个字符或功能键,并立即终止返回一个ConsoleKeyInfo结构的对象。ConsoleKeyInfo flag;do flag=Console.ReadKey();while(flag.Key!=C
10、onsoleKey.Escape);/等待用户按下键,3.1 一个简单的C#程序设计,2.控制台输出 C#语言在Console类中提供了两种公共方法向命令提示符窗口输出字符串:Write()和WriteLine()。这两种方法都是将各种值类型数据或对象转换为字符串写入标准输出流,即输出到命令提示符窗口,但是WriteLine()在输出数据后,还输出回车符(“r”)和换行符(“n”)。int age=20;string name=韩梅梅;Console.Write(name);/输出字符串name,不换行 Console.Write(年龄是:);/输出字符串“年龄是:”,不换行 Console.
11、Write(0rn,age);/输出字符串“20”,换行最后三句的输出,用Console.WriteLine()方法写成:Console.WriteLine(0年龄是:1,name,age;从上面的语句也可以看出Write()和WriteLine()调用参数的方法。,3.2 标识符和关键字,3.2.1 标识符 标识符最多可以由511个字符组成,需要遵循下列命名规则:由字母、数字和下划线“_”组成。首字符必须是字母或下划线“_”。C#语言对字母大小写敏感。两个标识符即使是对应的字母大小写不同,也是完全不同的标识符。标识符不能与关键字同名。C#语言采用Unicode字符集,因此“字母”和“数字”的
12、定义比常用的ASCII字符集(Unicode的一个子集)要广泛的多。标识符中的一个字母即使字体发生改变,也会成为新的标识符。,下面是合法的标识符:Abcabc123class,下面是不合法的标识符:abc!/含有特殊字符“!”7abc/非法的首字符abc 123/含有空格class/“class”是关键字,不能使用关键字作为标识符,3.2 标识符和关键字,3.2.2 关键字 C#语言保留77个标识符作为关键字,用户不应重用这些标识符。每个关键字都有特定的含义和用途,例如在示例中已经使用过的关键字using、namespace和calss。,3.3 值类型,C#是强类型语言,即每个变量和对象都必
13、须具有声明的数据类型。从用户的角度,数据类型可分为内置数据类型(如int、char等.NET Framework预定义好的类型)和用户自定义数据类型(如class、interface等,由用户声明创建)。从数据存储的角度,则可分为值类型、引用类型和指针类型(不符合公共语言规范)。指针类型只在不受托管的代码中使用;值类型用于存储数据的值,包括简单值类型、结构类型和枚举类型;引用类型用于存储对实际数据的引用地址,包括类类型、接口类型、委托类型和字符串类型等。,3.3 值类型,值类型和引用类型的区别:当一个值类型的变量赋给另一个值类型的变量时,会在堆栈(stack)中保存两个相同的值;而一个引用类型
14、的变量赋给另一个引用类型的变量时,会在堆栈中保存对同一个堆(heap)的位置的引用。每个值类型变量都有独立的值,对其进行数据操作不会影响到其他的值类型变量;而对引用类型变量进行数据操作,就是对该变量所引用的堆中的数据进行操作,从而会影响到引用同一个堆的其他引用类型变量。,3.3 值类型,3.3.1 简单值类型1.整型 整型的数据值都是整数。C#语言提供了8种整型:sbyte、byte、short、ushort、int、uint、long、ulong。它们的取值范围和占用存储空间位数各有不同,定义变量时要选择合适的数据类型,过长的类型会浪费存储资源,过短的类型不足以满足变量的变化范围。,下面的语
15、句是正确的:int a;a=321;/先定义,再赋值long b=321;/先隐式转换,再赋值long c=0 x12aL;/十六进制表示int x1=10,x2,x3=30;/可以在一个语句中声明多个变量,下面的语句是错误的:uint x=-49;/无符号整数不能为负byte x=300;/超出取值范围short y;Console.WriteLine(y);/变量在赋值前不能被使用,3.3 值类型,2.浮点型 浮点型包括单精度(float)和双精度(double)两种,分别采用32位单精度和64位双精度的IEEE 754格式表示。float型变量赋值时应在数值后加上类型指示符F,因为默认情
16、况下赋值运算符右侧含数值被视为double型。下面的语句都是正确的:float x=3.5F;double y=4.5;,3.3 值类型,3.小数(decimal)型 小数(decimal)型是特殊的浮点型数据,它是128 位的数据类型。同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算(小数部分的舍入方法采用的是银行家舍入方式)。4.布尔(bool)型 布尔(bool)型用于声明变量来存储布尔值true和false,可将布尔值赋给bool变量,也可以将计算为bool类型的表达式赋给bool变量。bool型主要用于逻辑判断。bool型正确用法如下:bool
17、 i=true;bool a=(i0 在计算机内部实际上是用二进制1和0表示布尔值true和false。,3.3 值类型,4.字符(char)型 字符(char)型用于声明16位的Unicode 字符。C#语言中字符型的变量可以使用字符、加十六进制的转义符前缀(“x”)和Unicode表示形式来进行赋值。例如:char c1=B;/字符表示的字母“B”赋值给变量c1 char c2=x0042;/字符表示的字母“B”赋值给变量c2 char c3=u0042;/字符表示的字母“B”赋值给变量c3,3.3 值类型,3.3.2 结构类型(struct)结构类型是一种值类型,通常用来封装小型相关变量
18、组。声明结构类型的语法表达式为:附加声明访问修饰符struct 结构名称:实现的接口结构体;表示里面的内容为可选项。结构体中定义该结构的成员,结构类型的成员可以是数据成员、方法成员、另一个结构类型成员等。例如:struct student public string name;public int ID;public int score;student是结构名称,花括号之间是结构体,name、ID、score都是这个结构的数据成员(此处可称为字段)。,3.3 值类型,【示例代码:chpt3-3aMyStructType】(1)在Visual Studio 2005中新建一个C#控制台应用程序。
19、在新建项目对话框中的“名称”文本框中输入“MyStructType”,确定后,生成一个名为MyStructType的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。(2)编写如下所示的代码。namespace MyStructType class Program static void Main(string args)student s;/使用结构类型 s.name=赵鹏;/给结构中的字段变量赋值 s.ID=10814;s.score=90;,3.3 值类型,Console.Title=chpt3-3a;Console.WriteLine(学生0的学号是1,他
20、的成绩是2分,s.name,s.ID,s.score);Console.WriteLine(DateTime.Now);Console.Read();struct student/声明结构类型 public string name;public int ID;public int score;,3.3 值类型,运行此程序,得到的结果如图 程序中除了使用了自定义的结构Student之外,还使用了一个预定义的结构DateTime。通过DateTime结构的成员,用户可以方便的调用系统时钟,得到当前年、月、日、时、分、秒、当前时刻、日期、星期几等信息。,3.3 值类型,3.3.3 枚举类型(enum
21、)枚举类型是一种由一组称为枚举数列表的常数组成的独特类型。它的实质就是用标识符来表示一组相互关联的数据。每种枚举类型都有对应的数据类型,可以是除char以外的任何简单值类型。枚举类型是使用关键字enum定义的,声明枚举类型的一般语法表达式为:附加声明访问修饰符enum枚举变量名称:数据类型枚举列表;,3.3 值类型,枚举列表中成员的默认类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:enum Weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;在这个枚举中Sun为0,Mon为1,Tue为2,依次类推。如果需要改变默认的值,则要在定
22、义时改变设定值。例如:enum Weekdays:longSun=1,Mon,Tue,Wed,Thu=22,Fri,Sat;在这个枚举中枚举的成员类型是长整型long,Sun为1,Mon为2,Tue为3,Wed为4,Thu为22,Fri为23,Sat为24。,3.3 值类型,【示例代码:chpt3-3b MyEnumType】(1)在Visual Studio 2005中新建一个C#控制台应用程序。在新建项目对话框中的“名称”文本框中输入“MyEnumType”,确定后,生成一个名为MyEnumType的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。(2)编写
23、如下所示的代码。namespace MyEnumType class Program enum Weekdays 星期日,星期一,星期二,星期三,星期四,星期五,星期六;static void Main(string args)/声明Weekdays枚举类型的变量mydayWeekdays myday=Weekdays.星期日;Console.Title=chpt3-3b;,3.3 值类型,Console.WriteLine(今天是:0,DateTime.Now.Date.ToShortDateString();/将当前日期强制转换为Weekdays枚举类型 myday=(Weekdays)D
24、ateTime.Now.DayOfWeek;Console.WriteLine(myday);Console.Read();运行此程序,得到的结果如图,3.4 引用类型,引用类型只存储对实际数据的引用地址。C#语言的引用类型包括类、接口、委托、数组、字符串等。本节只介绍object类型、类类型、字符串类型和数组类型。,3.4 引用类型,3.4.1 object类型 object 类型在.NET Framework 中是Object(注意大小写)的别名。在 C#的类型系统中,所有类型(预定义类型、用户定义类型、其他引用类型和值类型)都是直接或间接从Object继承的。因此可以将任何类型的值赋给o
25、bject类型的变量。下面的例子演示了object类型的变量如何接受任何类型的数据的值,以及object类型的变量使用Object的方法。【示例代码:chpt3-4a MyObjectType】(1)在Visual Studio 2005中新建一个C#控制台应用程序。在新建项目对话框中的“名称”文本框中输入“MyObjectType”,确定后,生成一个名为MyObjectType的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。,3.4 引用类型,(2)编写如下所示的代码。namespace MyObjectType class Program static v
26、oid Main(string args)object a;a=100;Console.Title=chpt3-4a;Console.WriteLine(a的值是0,a);Console.WriteLine(此时值的类型是0,a.GetType();/GetType是Object类的一个方法用来获得当前实例的Type a=AA;Console.WriteLine(a的值是0,a);Console.WriteLine(此时值的类型是0,a.GetType();Console.Read();,3.4 引用类型,运行此程序,得到的结果如图,3.4 引用类型,3.4.2 类类型 类是C#或面向对象程序
27、设计中最重要的概念,本书将在第4章对类及其使用方法进行详细说明。类是能存储数据并执行操作的复杂数据结构,用来定义对象可执行的操作(方法、事件、属性等),类的实例是对象。类是使用关键字class定义的,声明类的语法表达式为:附加声明访问修饰符class 类名称:基类名以及实现的接口列表/类成员定义 其中基类只能有一个,而接口可以有多个。一个类可包含的成员可以有:构造函数、析构函数、常数、字段、方法、属性、索引器、运算符、事件、委托、类以及结构等,可以说一切皆在类中。,3.4 引用类型,3.4.3 字符串类型 字符串(string)类型是一系列Unicode字符组成的序列。较C/C+语言而言,在C
28、#语言中字符串的赋值等操作更加简便。用户可以使用System.String中定义的方法进行各种字符串操作,例如:截取、赋值、索引、大小写转换、比较等。下面的示例演示了字符串操作的几种常用方法。【示例代码:chpt3-4b MyStringType】(1)在Visual Studio 2005中新建一个C#控制台应用程序。在新建项目对话框中的“名称”文本框中输入“MyStringType”,确定后,生成一个名为MyStringType的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。,3.4 引用类型,(2)编写如下所示的代码。namespace MyString
29、Type class Program static void Main(string args)string s1=this is a string;string s2=s1;/可以直接字符串赋值 string s3=s1+:hello world;/直接附加其他字符串,返回一个新的实例 Console.Title=chpt3-4b;Console.WriteLine(s1);Console.WriteLine(s2);Console.WriteLine(s3);/比较两个字符串大小,即长度/大于返回结果为1,等于返回结果为0,小于返回结果为-1 Console.WriteLine(s1与s2
30、的比较结果为:0,string.Compare(s1,s2);Console.WriteLine(s1与s3的比较结果为:0,string.Compare(s1,s3);/比较两个字符串是否相等,相等结果为True,不相等结果为False Console.WriteLine(s1与s3的比较结果为:0,s1=s3);,3.4 引用类型,/查找指定字符串在字符串中出现的位置,序号从0开始 Console.WriteLine(s1中首次出现is的位置是:0,s1.IndexOf(is);Console.WriteLine(s1中最后一次出现is的位置是:0,s1.LastIndexOf(is);/
31、在指定的位置插入字符串 Console.WriteLine(s1中插入字符串C#后变成:0,s1.Insert(10,C#);/替换指定的字符串 Console.WriteLine(s1中替换字符串second后变成:0,s1.Replace(a,second);/转换字符串中字母的大小写 Console.WriteLine(s1转为大写后:0,s1.ToUpper();/使用StringBuilder类生成的字符串可以动态分配内存空间/对该类的字符串操作不会生成新的实例 StringBuilder s4=new StringBuilder(Test this string);Console.
32、WriteLine(s4);s4.Append(在原字符串所占内存空间后直接附加);Console.WriteLine(s4);Console.Read();,3.4 引用类型,运行此程序,得到的结果如下图:,3.4 引用类型,字符串可以按照规定的格式化输出显示,规定格式化的方法为:N,M:formatCode 其中方括号 表示其中为可选项。N表示第几个参数,N从0开始,随调用的参数数目依次增加。M用于指定字符串长度和对齐方向(负值为左对齐,正值为右对齐),例如:1,-7表示第2个参数左对齐,占7位,不够7位右边补空格。formatCode是格式化类型代码。,3.4 引用类型,常用的格式化类型
33、示例,3.4 引用类型,3.4.4 数组类型 数组(array)类型是由若干个数据类型相同的数组元素构成的数据结构。数组元素可以是C#语言中定义的任意数据类型,其中也包括数组类型本身。每个元素可以通过数组名称和索引(index)进行访问。同C/C+一样,C#语言中数组元素的索引也是从0开始。按照数组的维数,数组可分为一维数组和多维数组,多维数组又可分为矩形数组和交错数组。常用数组声明的语法表达式如下:,3.4 引用类型,1.一维数组 创建数组可以用几条语句分步实现,即先声明,再创建和初始化。例如:int a,b;/声明数组a和数组b;a=new int4;/使用new运算符创建含有4个int型
34、整数实例a b=new int55,4,3,2,1;/使用new运算符创建数组实例b,并初始化为指定值也可以用一条语句来实现声明、创建和初始化,例如:int c=new int42,4,5,7;还可以用一种更简洁的方式创建数组,例如:bool d=true,false,true,false;不过,这种简洁方式只能与数组声明出现在同一条语句中,例如:int e;e=3,7,2,5,5;/错误new运算符创建数组时,如果数组元素是值类型,那么初始化的默认值为0(char型为u0000,bool型的为False);如果数组元素是引用类型,那么初始化的默认值为null(空)。,3.4 引用类型,一维数
35、组的创建和使用的示例:【示例代码:chpt3-4c MyArrayType】(1)Visual Studio 2005中新建一个C#控制台应用程序。在新建项目对话框中的“名称”文本框中输入“MyArrayType”,确定后,生成一个名为MyArrayType的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。(2)编写如下所示的代码。namespace MyArrayType public class A/定义一个类A private int i;public A(int a)/类的构造函数 i=a*2;public int I/类的一个成员 get return
36、 i+1;,3.4 引用类型,class Program static void Main(string args)Console.Title=chpt3-4c;int a,b;/声明两个int型的数组a,b;它们的数组元素都是int型 a=new int44,3,2,1;/数组a含有4个int型数值,并赋初值为4,3,2,1 b=new int5;/数组b含有5个int型数值,初值全为默认值0 Console.Write(int型数组a:n);/采用foreach语句遍历数组a,输出数组a foreach(int i in a)Console.Write(0t,i);Console.Writ
37、e(n int型数组b:n);foreach(int i in b)Console.Write(0t,i);/遍历数组b,输出数组b bool c=true,false,true,false;/用简捷方式创建一个bool型的数组 Console.Write(n bool型数组c:n);foreach(bool i in c)Console.Write(0t,i);/遍历数组c,输出数组c,3.4 值类型,/创建数组f,含有4个object型数组元素,初始值为默认值null object d=new object4;Console.Write(n object型数组d:n);for(int i=
38、0;id.Length;i+)Console.Write(d0=1t,i,di);/创建一个类类型的数组,数组元素必须使用new运算符创建实例 A h=new A3 new A(3),new A(7),new A(11);Console.Write(n 通过类类型数组h使用类的属性:n);foreach(A i in h)Console.Write(0t,i.I);Console.Read();,3.4 引用类型,运行此程序,得到的结果如下图:,3.4 引用类型,2.多维数组 多维数组的声明、创建以及初始化的方式与一维数组相似。例如:int,array1=new int3,2,4;/三维数组,
39、有24个数组元素,初始化为0 数组的秩(rank)是指数组的维数,如一维数组的秩为1,二维数组的秩为2,依次类推;数组的维数长度指的是每一个维度的长度,例如array1的第1维的维数长度是3,第2维的维数长度是2;数组的长度指的是数组中所有元素的总和,array1的数组长度就是24。多维数组初始化时,需要仔细核对大括号的层数和位置。例如:int,array1=new int3,21,2,3,4,5,6;/二维数组,有两层大括号/三维数组,维数长度分别是2,1,3 int,array2=new int,1,2,3,4,5,6;int,array3=1,2,3,4,5,6;/二维数组,维数长度分别
40、是3,2 数组每个维的长度和相应级别大括号中的元素个数相同。最外层的大括号(不算初始化所使用的那对大括号)的个数与最左边的维数对应,最内层的元素个数与最右边的维数对应。,3.4 引用类型,访问多维数组的元素可以使用下面的表达式:数组名索引表达式1,索引表达式2,每个索引表达式的值必须在0到相应维数长度减1之间,例如访问array2中值为3的那个元素,应使用表达式:array20,0,2;而array21,0,1=5。使用数组要特别防止“越界”,即索引表达式的值超出了维数长度减1的范围。如表达式:array22,1,3,编译时不会被发现,当执行该代码时才会报错。,3.5 类型转换,某些数据类型之
41、间可以进行相互转换,转换可以是隐式地(implicit)或显式地(explicit),某些值类型之间也可以采用Convert类提供的静态方法进行转换。值类型隐式地转换为object类型的称为装箱,object类型显式地转换为值类型称为拆箱。,3.5 类型转换,1.隐式转换 隐式转换是编译系统自动进行的,不需要交易声明就可以进行的转换,也叫自动转换。隐式转换一般是安全的,不会造成信息丢失及隐患。除装箱操作外,一般隐式转换发生在值类型数据间。如果是从低精度、小范围的简单值数据类型到高精度、大范围的简单值类型可以进行隐式转换,包括以下几种情况:小范围的整数类型可以隐式地转换成大范围的整数类型。整数类
42、型可以隐式地转换成浮点类型和小数类型。float类型可以隐式地转换成double类型。char类型可以隐式地转换成ushort、uint、int、ulong、long、float、double类型。下面给出隐式转换的示例:long a=10;/定义long整型 float b=a;/隐式地转换为单精度浮点型 int c=a;/错误,int类型的精度低于long类型的精度 char s=A;/定义字符型 a=s;/隐式地转换为int整型,a等于65,3.5 类型转换,2.显式转换 显式转换又称强制转换,不满足隐式转换条件的简单值类型之间只能进行显式转换。显式转换需要用户明确指定转换的目标类型,例
43、如:double f=1234.56;int i=(double)f;/将f的值显式地转换为int类型,i等于1234 sbyte s=(sbyte)f;/将f的值显式地转换为sbyte类型,s等于-46 枚举类型在本质上也是整数,但枚举类型和简单值类型之间只能进行显式转换,只有常数0例外,0可以直接赋值给枚举类型的变量。例如:enum Weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;Weekdays w=(Weekdays)4;/显式转换后,w的值为Thu Weekdays w1=(Weekdays)10;因为w1被赋予的值超出了枚举定义的范围,w1的值就是10,但
44、其数据类型仍然是枚举类型。需要强调的是,显式转换包含所有隐式转换,但显式转换可能会失败,有可能出现编译错误,但有时编译器也发现不了,而且转换过程会出现信息丢失。,3.5 类型转换,3.引用类型之间的转换 引用类型之间也可以进行转换,其基本原则是:如果引用类型B是从引用类型A继承的,那么B可以隐式转换到A;反之,只能进行显式转换,且不一定成功。例如:class A public int i;class B:ClassApublic int j;/类B继承自类A class Teststatic void Main()B myclass1=new B();/派生类B的对象可以隐式地转换成基础类A的
45、对象A myclass2=myclass1;/基础类A的对象显式地转换成派生类的对象B myclass3=(B)myclass2;Console.WriteLine(0,myclass2.i);/正确Console.WriteLine(0,myclass2.j);/编译错误Console.WriteLine(0,myclass3.i);/正确,3.5 类型转换,4.Convert类的方法 Convert类中提供了相当多的方法,可以将一个基本数据类型转换成另一个基本数据类型,其支持的基本数据类型有Boolean、Char、Int16、Int32、Int64、UInt16、UInt32、UInt6
46、4、SByte、Byte、Single、Double、Decimal、DateTime、String。这些方法的名称通常以“To”开头,例如:int a=10;string s1;s1=Convert.ToString(a);。,3.6 变量和常量,3.6.1 常量 在程序运行过程中值不发生改变的量称为常量。C#有两种类型的常量:常数常量(使用const关键字声明)和只读常量(使用readonly关键字声明)。常数常量只能在声明时赋值,编译时编译器把常量全部初始化成常数(包括null),引用类型常量只能赋值null。其声明常量的一般语法表达式为:访问修饰符 const 数据类型 常量名=表达式
47、;例如:public const double pi=3.1415926;只读常量可以在声明时赋值,也可以在构造函数中赋值。只读常量的值可以是值类型,也可以是引用类型。只读常量在编译时不初始化,在程序运行时才初始化成常数或引用。例如:readonly DateTime now;public ClassA()now=DateTime.Now;使用只读常量可以在不同类的构造函数中使用不同的初始化值。,3.6 变量和常量,3.6.2 变量 变量是用于保存数据的存储单元,变量名代表了存储地址。通过变量名,程序可以操作相应的存储单元,对其中的数据进行读写或修改。变量的数据类型必须和存储单元中的数据类型保
48、持一致。1.变量的声明 变量必须先声明后使用。声明变量就是给变量指定一个类型和一个名称,声明变量后,编译器会给该变量分配一定大小的存储单元。变量可以在声明时赋值,也可以在运行时赋值。声明变量的一般语法表达式为:访问修饰符数据类型 变量名=表达式;在C#语言中,变量名必须遵守以下规范:变量名必须以字母、下划线或开头。变量名只能由字母、数字和下划线组成,不能包含空格、标点符号和运算符等其他符号。变量名不能与关键字相同,如public、class等。变量名不能与类库名称相同。,3.6 变量和常量,下面是变量声明的例子:int i,j;/正确,可以同时声明同一数据类型的变量 double g4=1.3
49、24;/正确 double name_07;/正确 double name-07;/不正确,含有非法字符“-”double Main;/不正确,变量名和库函数名相同 double const;/正确,3.6 变量和常量,2.变量的类型 C#语言定义了7种变量类型。静态变量和实例变量 用static修饰符声明的变量称为静态变量。静态变量从属于包含它的类,一旦所从属的类被装载,直到该类运行结束,静态变量将一直存在。静态变量的初始值是该变量的类型的默认值。未用static修饰符声明的变量称为实例变量。类的实例变量在创建该类的新实例时开始存在,在所有对该实例的引用都已终止,并且已执行了该实例的析构函数
50、(若有)时终止。结构中的实例变量随着它所属的结构变量存在或结束。值参数 值参数是在函数成员中未用ref或out修饰符声明的参数,也是一种变量。值参数向方法或函数传递数据的值。,3.6 变量和常量,引用参数和输出参数 引用参数是用ref修饰符声明的参数,它传递的不是值而是被调用对象变量的引用,即它和对应的函数成员中的变量指向同一个存储位置。输出参数是用out修饰符声明的参数,它用于传递方法或函数返回的数据,而不能向方法或函数内部传递数据。局部变量 局部变量是在一个独立的程序块(在“”“”之间的代码)、for语句、switch语句或using语句中声明的变量,它只在该块或语句中有效。,3.7 表达