第3讲数据类型教学目标:(1)了解C#中的标识符和关键字(2)掌握强类型语言的含义、变量和常量的使用方法(3)掌握C#数据类型的划分,区别值类型和引用类型(4)掌握C#语言的简单类型(5)掌握C#语言的类型转换规则3.1标识符与关键字标识符几乎可以使用任何名称,但必须遵循以下语法规则:只能使用字母(大写的或小写的)和数字。标识符必须以字母或者下划线(“_”)开头。标识符以@符号开始时,允许使用关键字来作为标识符。3.2变量和常量1.变量C#是强类型语言。强类型语言要求程序设计者在使用数据之前必须对数据的类型进行声明。使用强类型语言有很多好处,例如,错把一个整数当做一个职工的编号,编译器就会产生错误信息提示。在程序设计中很多的错误是发生在数据类型的误用上的,强类型语言能够检查出尽可能多的数据类型方面的错误。另一方面使用强类型语言也能更清楚地表达作者的意图,使代码更具可读性。(1)定义:变量是指其值在运行时可以改变的量。C#中,定义变量时必须指定一种数据类型。例:intx,y;//x,y是整数类型变量doublew=3.1415;//w是实数类型变量booltruth=true;//truth是布尔类型变量(2)变量的初始化C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其值就默认是0。方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。classProgram{staticintMain(string[]args){intd;//没有初始化,将出现一个错误Console.WriteLine(d);return0;}}(3)变量的作用域在方法内部定义的变量称为局部变量,而在类部分定义的变量称为类成员变量,即字段。局部变量和类成员变量的作用范围不同,前者只限于方法内部使用,后者的使用范围由访问修饰符限定。classProgram{staticintMain(string[]args){for(inti=0;i10;i++){Console.WriteLine(i);}for(inti=9;i=0;i--){Console.WriteLine(i);}Console.ReadLine();return0;}}classProgram{staticintMain(string[]args){intj=20;for(inti=0;i10;i++){intj=30;//错误:不能在此范围内声明名为“j”的局部变量,因为这样会使“j”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了Console.WriteLine(j+i);}Console.ReadLine();return0;}}classProgram{staticintj=20;publicstaticvoidMain(string[]args){intj=30;Console.WriteLine(j);Console.WriteLine(Program.j);Console.ReadLine();}}2.常量定义:对于在程序运行期间其值保持不变的量,我们称之为常量。C#语言中使用关键字const来定义常量。在变量的前面加上关键字const把该变量指定为一个常量。优点:(1)常量使程序更方便修改(2)常量能够增加程序的可读性(3)常量能有助于避免程序出现错误形式:const类型常量名=表达式说明:(1)类型只能是数值或字符串(2)常量名应该全部使用大写,每个单词之间用下划线分隔便于程序员很容易地认出常量(3)表达式是必需的,即在声明常量的同时必须给它赋值。表达式可以是一个值,也可以是一个算术表达式,其中不能包含变量,但可以包含其他符号常量。例如:constdoublePI=3.14159;//代表圆周率constintMOMTH_IN_YEAR=12;//代表一年有12个月constdoubleMY_VALUE=3*PI;//可以包含符号常量inti=1;constintCONST_I=i+10;//错误,不能包含变量classProgram{constdoublePI=3.14159;staticvoidMain(string[]args){intr=10;Console.WriteLine(半径为{0}的圆周长是:{1},r,2*PI*r);Console.ReadLine();}}3.3C#的数据类型从概念上看,其区别是值类型直接存储其值,而引用类型存储对值的引用。它们存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。值类型和引用类型的区别如果我们创建两个值类型变量i和j,比如:inti=10;intj=20;则i和j彼此完全独立,并且分配了不同的内存位置:如果我们改变这些变量中的某一个的值,另一个自然不会受到影响。然而,引用类型的做法却不同。例如,我们可以这样声明两个变量:classmyclass{…}myClassa=newmyClass();myClassb=a;第一行在内存中创建了myClass的一个实例,并且将a设置为引用该实例。因此,当我们将b设置为等于a时,它就包含了对内存中类的引用的重复。如果我们现在改变b中的属性,a中的属性就将反映这些改变,因为这两者都指向内存中的相同对象一、整型数据classProgram{staticvoidMain(string[]args){Console.WriteLine(byte的最小值为:+byte.MinValue+最大值为:+byte.MaxValue);Console.WriteLine(int的最小值为:+int.MinValue+最大值为:+int.MaxValue);Console.WriteLine(long的最小值为:+long.MinValue+最大值为:+long.MaxValue);Console.ReadLine();}}classProgram{staticvoidMain(string[]args){inti=int.Parse(Console.ReadLine());Console.WriteLine(i+的二进制为:+Convert.ToString(i,2));Console.WriteLine(i+的八进制为:+Convert.ToString(i,8));Console.WriteLine(i+的十六进制为:+Convert.ToString(i,16));Console.ReadLine();}}classProgram{staticvoidMain(string[]args){stringbin=10111001;stringoct=2516;stringHex=6A9B;Console.WriteLine(Convert.ToInt32(bin,2));Console.WriteLine(Convert.ToInt32(oct,8));Console.WriteLine(Convert.ToInt32(Hex,16));Console.ReadLine();}}二、实型数据1.浮点型float和doubleC#完全遵循IEEE754标准,这是被业界广泛使用的标准。WilliamKahan1987年图灵奖的获得者,8087浮点处理器(FPU)的设计者。floatf=123456789f;Console.WriteLine(f);f=12345.6789f;Console.WriteLine(f);应当尽量使用double而不是float进行浮点运算。floatf=2.58f;doubled=f+6.1;Console.WriteLine(d);浮点数在进行数学运算时不会抛出异常。Console.WriteLine(2e300*2e300);Console.WriteLine(100d/0d);Console.WriteLine(0d/0d);银行家舍入法(就近舍入法、四舍六入五成双)机会均等才公平,也就是向上和向下各占一半才合理Console.WriteLine(Math.Round(1.24,1));Console.WriteLine(Math.Round(1.25,1));Console.WriteLine(Math.Round(1.26,1));Console.WriteLine(Math.Round(1.35,1));2.decimal类型与浮点型,decimal具有更高的精度和更小的范围,适合于财务和货币计算。decimalmyMoney=300.5m;decimal在进行数学运算时,如果出现超出范围或除零现象,将会抛出异常。建议进行财务货币计算时,统一使用decimal类型。三、字符型数据C#语言的字符不是采用8位值,而是采用Unicode编码的16位字符类型。标准的8位ASCII码字符集是Unicode编码的子集,因此ASCII码字符仍是有效的C#字符。所有Unicode字符的集合构成字符类型。Console.Write(\\x48\x65\x6c\x6c\x6f\n);Console.Write(\x57\x6f\x72\x6c\x64\x21\\a);一些常用的操作字符的方法:for(charc='\0';;c=Convert.ToChar(Console.ReadLine())){if(char.IsDigit(c)){Console.WriteLine(c+这是一个数字);}elseif(char.IsLetter(c)){Console.WriteLine(char.ToUpper(c)+这是一个字母);}}四、布尔类型布尔类型数据用于表示逻辑真和逻辑假,布尔类型的类型标识符是bool。布尔类型常数只有两种值:true(代表“真”)和false(代表“假”)。布尔类型数据主要应用在流程控制中。程序员往往通过读取或设定布尔类型数据的方式来控制程序的执行方向。bool类型表示真/假值。C#用预留的true和false来定义真和假。因此bool类型的变量或表达式的值是这两个值之一。另外在bool类型和整数值之间不存在转换。不能再0或1表示布尔类型的值了。五、字符串类型strings1=Hello;strings2=s1+World!;Console.WriteLine(s2);Console.WriteLine(c:\\Docs\\source\\a.txt);Console.WriteLine(@c:\Docs\source\a.txt);strings=HELLOWORLD!;Console.WriteLine(s.IndexOf('L'));Console.WriteLine(s.IndexOf(OR));Console.WriteLine(s.IndexOf(OK));strings=HELLOWORLD!;s=s.Trim();s=s.ToLower();Console.WriteLine([+s+]);strings1=一个字符串;strings2=s1;Console.WriteLine(s1是:+s1);Console.WriteLine(s2是:+s2);s1=另一个字符串;Console.WriteLine(s1现在是:+s1);Console.WriteLine(s2现在是:+s2);没有体现引用类型应有的特性,这实际上是运算符重载的结果。3.4数据类型的转换1.隐式数值转换doubled=10f+9+'a'+2.5;对于数字而言,一种类型可以转换为哪几种类型不需要死记硬背,只需理解以下两个原则就可以了:(1)目标类型占用空间不能比源类型小。(2)目标类型的取值范围可以容纳源类型的取值范围。inti=128L;//失败intj=100;uintui=200;longl=i;ulongul=i;//失败intk=ui;//失败longm=ui;inta=2F;//失败floatf=i;int