• 1. C#数据类型 第2章C#程序设计
  • 2. 第1章知识点回顾.NET技术包括规范和实现,其规范叫公共语言架构(CLI)。 .NET Framework则是对该规范的实现;后者包括.NET类库和公共语言运行时(CLR)。 C#程序是在CLR的基础上运行的,CLR提供的主要功能包括:管理代码的执行,提供通用类型系统以及提供系统服务。 在C#程序结构中,命名空间下包含了类、结构等类型定义,这些类型又包含了各自的成员定义。 C#可执行程序的入口是Main方法,程序的执行从Main方开始,到Main方法结束。但动态链接库(DLL)文件程序可以没有Main方法。 C#程序的注释方式有单行注释和多行注释:前者从“//”符号开始直到该行结束;后者则包含在“/*”和”*/”符号之间。 C#控制台应用程序使用console类与用户进行交互,其接受用户输入的方法包括Read、ReadKey和ReadLine,而输出方法有Write和WriteLine。
  • 3. 第2章值类型1引用类型2类型转换3
  • 4. 为了告诉计算机以何种方式来解释和处理数据,每种程序设计语言都有自己的类型系统。值类型 简单值类型:整数 字符 实数 布尔 复合值类型:结构 枚举 引 用类型 类(class) 接口(interface) 委托 (delegate) 数组 (array)第2章在C#语言中,符合公共语言规范的数据类型可分为两大类:值类型和引用类型
  • 5. Object类ValueType类Array类Enum类…SByteInt16UInt16Int32UInt32Int64UInt64SingleDoubleByte自定义枚举自定义数组自定义类DateTimeString类Delegate类自定义委托EventHandler…KeyEventHandler…自定义结构…第2章.NET类库中的继承示意图
  • 6. 2.1 值类型——整数类型数据类型 说明 取值范围 对应于System程序集中的结构sbyte 有符号8位整数 -128~127 SByte byte 无符号8位整数 0~255 Byte short 有符号16位整数 -32 768~32 767 Int16 ushort 无符号16位整数 0~65 535 UInt16 int 有符号32位整数 -2 147 483 648~ 2 147 483 647 Int32 uint 无符号32位整数 0~4 294 967 295 UInt32 long 有符号64位整数 -9 223 372 036 854 775 808~ Int64 9 223 372 036 854 775 807 ulong 无符号64位整数 0~18 446 744 073 709 551 615 UInt64整数类型
  • 7. 2.1 值类型——整数类型上述8种结构都提供两个基本字段:MinValue和MaxValue,分别表示类型的最小值和最大值。类型取值超过规定范围,则会发生溢出。Console.WriteLine(“UInt32:{0}~{1}”,System.UInt32.MinValue,System.UInt32.MaxValue); sbyte x1 =sbyte.MaxValue; byte x2 = byte.MaxValue; Console.WriteLine(x1); //输出? Console.WriteLine(x2); //输出? x1 += 1; x2 += 1; Console.WriteLine(x1); //输出? Console.WriteLine(x2); //输出?2550127-128
  • 8. 2.1 值类型——字符类型单个字母、数字、标点符号及特殊字符 C#中采用Unicode字符集,一个字符长度16位 对应.NET类库中的结构System.Char 对字符型变量的声明和赋值 char x=‘a’; //使用单引号 char y=‘1’; char z=‘好’; //Unicode字符集中,单个汉字作为字符使用 对于一些特殊控制字符,C#使用反斜杠“\” 开头的转义符表示转义符 字符名 转义符 字符名转义符 字符名转义符 字符名\’ 单引号 \” 双引号 \\ 反斜杠\f 换页 \n 换行 \r 回车\0 空字符 \a 警报(响铃) \b 退格\t 水平制表符 \v 垂直制表符常用转义符
  • 9. 2.1 值类型——字符类型使用符号“@”可使转义符失效 string str = "Hello,\r\nworld!"; Console.WriteLine(str); //输出? string str1 = @"Hello,\r\nworld!"; Console.WriteLine(str1); //输出?Hello, world!Hello,\r\nworld!
  • 10. 2.1 值类型——字符类型C#中的字符其实是一种特殊的整数类型,其取值范围与ushort型相同。C#编译器负责在规定范围的整数和字符之间进行转换。如:char c=‘A’; ushort s=c; Console.WriteLine(c); //输出? Console.WriteLine(s); //输出?输出结果如下: A 65
  • 11. 2.1 值类型——实数类型数据类型 说明 取值范围float 32位单精度实数,有7位小数 ±1.5*10-45~ ± 3.4*1038 double 64位双精度实数,有15~16位小数 ±5.0*10-324~ ±1.7*10308 decimal 128位十进制实数,有28~29位小数 ±1.0*10-28~±7.9*1028 double x=1.2; // 对应于.NET类库中的System. Double结构 float y=1.2F; //对应于.NET类库中的System. Single结构 decimal z=1.2M; //对应于.NET类库中的System.Decimal结构实数类型
  • 12. 2.1 值类型——实数类型 这3种结构提供MinValue、MaxValue字段外,还提供了3个特殊字段:NaN(非数字)、PositiveInfinity(正无穷大)、NegativeInfinity(负无穷大)using System; namespace P2_2 { class Program { static void Main() { ComputeValue(double.PositiveInfinity); ComputeValue(double.NegativeInfinity); ComputeValue(double.NaN); } static void ComputeValue(double x) { Console.WriteLine("-1 * {0} = {1}", x, -1.0 * x); double d1 = 1.0 / x; Console.WriteLine("1 / {0} = {1}", x, d1); double d2 = -1.0 / d1; Console.WriteLine("-1 / {0} = {1}", d1, d2); Console.WriteLine(); }}}
  • 13. 2.1 值类型——布尔类型取值只能是true或false,分别表示“真”和“假”。不能使用1或0 对应.NET类库中的结构System.Boolean 对布尔型变量的声明和赋值 bool b1=true; //不能使用bool b1=1; bool b2=false; //不能使用bool b2=0; 与其他数据类型之间不存在任何对应关系。
  • 14. 2.1 值类型——结构 结构类型用于将一组数据组织在一起,采用关键字struct进行定义。如对联系人结构Contact的定义: struct Contact { public string name; public string phone; public string address; }结构的字段
  • 15. 2.1 值类型——结构 使用语句:Contact c1可以声明一个Contact类型的变量c1。 Contact c1=new Contact(); c1.name=“王晓明”;提示:(1)new关键字用于创建类型的对象; (2)对象成员的访问需要在对象名和成员名之间加“.”。
  • 16. 从C#3.0开始还支持如下形式的对象创建表达式,即在创建对象的同时为其一个或多个公有字段赋值。 Contact c1=new Contact() {name=“王晓明”,phone=“12345678”}; Console.WriteLine(c1.phone); //输出123456782.1 值类型——结构
  • 17. C#是完全面向对象的语言,程序中的每一个变量都是其类型的一个对象。 如何理解下列常用的赋值语句呢? int x=10;2.1 值类型——结构 上述语句实际上可以看成是下面两行语句的简写: int x=new Int32(); //创建对象 x=10; //为变量赋值提示:C#中的各种简单值类型都对应.NET类库中的一种结构。
  • 18. System命名空间中有一个非常重要的结构类型:DateTime,表示日期时间概念。 创建DateTime型的变量最常用 2种方式: DateTime dt1=new DateTime(2014,9,10); DateTime dt2=new DateTime(2014,1,1,12,30,0);2.1 值类型——结构 DateTime结构提供了多种属性、方法和操作符以完成相应的功能。 提示:通过视图下的对象浏览器进行查看。
  • 19. 结构中的成员可以是简单值类型、结构类型、枚举类型,还可是引用类型。 对结构成员的访问通过圆点连接符”.“进行struct Address { public string City; public string Street; public int Number; }2.1 值类型——结构 struct Contact { public string Name; public bool Gender; public DateTime Birthday; public Address Address; }
  • 20. 对结构成员的访问通过圆点连接符”.“进行static void Main(string[] args) { Contact c1 = new Contact() { Name = "Messi", Birthday = new DateTime(1987, 6, 24) }; c1.Address.City = "巴塞罗那"; Console.WriteLine("{0},{1}年生,所在城市: {2}", c1.Name, c1.Birthday.Year, c1.Address.City); }2.1 值类型——结构
  • 21. 2.1 值类型——枚举 枚举类型是另一种复合值类型,采用关键字enum进行定义。表示一组逻辑上相关联的项的组合。 enum Weekday { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday } 枚举类型只是“列举”出各个成员,其变量在某一时刻只能取其中某个成员的值。
  • 22. 对枚举成员的访问通过圆点”.“进行,但不是通过枚举类型的变量,而是通过枚举类型名。如: Weekday w1; w1=Weekday.Monday; 枚举的成员类型实际上都是整数类型int C#默认枚举中第一个成员对应的整数值为0,其后各个成员的整数值依次递增1。 对枚举类型的变量所赋的值可以不限定在范围之内。如:w1=(Weekday) 200;也是合法的。2.1 值类型——枚举
  • 23. 针对上面定义的枚举类型Weekday2.1 值类型——枚举 static void Main(string[] args) { Weekday w1 = Weekday.Sunday; Console.WriteLine(w1); w1 += 1; Console.WriteLine(w1); w1 += 5; Console.WriteLine(w1); w1 += 1; Console.WriteLine(w1); }
  • 24. 引用类型 类(class) 数组 (array) 接口(interface) 委托 (delegate)第2章
  • 25. 2.2 引用类型——类类是一组具有相同数据结构和相同操作的对象的集合。是对一组同类对象的抽象描述。 类的定义使用关键字class。 class Contact { public string name; public bool gender; public string phone; public DateTime Birthday; public Address address; }结构和类的根本区别在于结构是值类型,而类是引用类型
  • 26. 2.2 引用类型——类声明类的变量(即创建一个类的对象)必须使用关键字new。 对于值类型,每个变量直接包含自身的所有数据,每创建一个变量,就在内存中开辟一块区域。对于引用类型,每个变量只存储对目标数据的引用,每创建一个变量就增加一个指向目标数据的指针。 struct SPoint { public int X; public int Y; }class CPoint { public int X; public int Y; }
  • 27. 2.2 引用类型——类static void Main() { SPoint s1=new SPoint(){X=0,Y=0}; SPoint s2=s1; s2.X=5; s2.Y=10; Console.WriteLine(“结构变量s1:X={0},Y={1}”,s1.X,s1.Y); CPoint c1=new SPoint(){X=0,Y=0}; CPoint c2=c1; c2.X=5; c2.Y=10; Console.WriteLine(“类变量c1:X={0},Y={1}”,c1.X,c1.Y); }
  • 28. s1s1 : SPointX : 0Y : 0s2┊┊s2 : SpointX : 0 Y : 0 c1┊c1 : CPointX : 0Y : 0 510510c2, c2┊2.2 引用类型——类
  • 29. C#中的null表示空引用,它可以被赋值给任何的引用类型的变量,此时引用变量不指向任何对象 如:Contact c=null; 类之间可以存在继承关系,被继承的类称为“基类”或“父类”,实施继承的类称为“派生类”或“子类”,基类中所有非私有成员都将被派生类继承。 在定义类时,可在类名称后面用冒号“:”加基类名称说明继承关系。2.2 引用类型——类
  • 30. class Colleague:Contact { public string m_Fax; } 类之间的继承存在传递关系。 C#规定,一个类只能有一个基类。 Object是所有类的基类,其常用方法ToString和Equals2.2 引用类型——类int x=10; string s1=x.ToString(); //s1=“10” double y=2.5; string s2=y.ToString(); //s2=“2.5”
  • 31. 数组是指同一类型的变量的有序集合,其中的变量称为数组元素。2.2 引用类型——数组一维数组 定义(声明):T[] array-name; int[] arr1; Contact[] arr2; 初始化(生成数组实例):array-name = new T[size]; arr1=new int[3]; //数组在初始化之后长度就是固定的 arr2=new Contact[3]; 访问数组元素:[] arr1[0]=1; arr1[1]=2; arr1[2]=4;
  • 32. 一维数组 注意:C#中数组元素的下标从0开始,第n个元素的索引为n-1。如果索引超出了数组界限,程序会引发IndexOutOfRangeException异常类。 定义 + 初始化 + 赋值: T[] array-name = const-exp; int[] arr1=new int[]{1,2,4}; 或: int[] arr1={1,2,4}; 所有数组都默认继承自.NET类库中(mscorlib程序集)的System.Array类。可使用该类的各种成员:Length属性、GetLength方法可获得数组长度(数组元素的个数);Rank属性可获得数组的维数;GetValue方法或索引函数[]可访问指定的数组元素。 2.2 引用类型——数组
  • 33. 一维数组 如:int[] arr1 = new int[] { 1, 2, 4 }; Console.WriteLine(arr1.Length); Console.WriteLine(arr1[0]); Console.WriteLine(arr1.GetValue(1)); Console.WriteLine(arr1[2]); Console.WriteLine(arr1.GetLength(0)); Console.WriteLine(arr1.Rank); 2.2 引用类型——数组
  • 34. 数组元素为引用类型 class Program { static void Main(string[] args) { CPoint[] pts = new CPoint[3]; pts[0] = new CPoint() { X = 3, Y = 3 }; pts[1] = new CPoint() { X = 5, Y = 10 }; pts[2] = pts[0]; pts[2].Y = pts[1].X; Console.WriteLine(pts[0].Y); } } 2.2 引用类型——数组 class CPoint { public int X; public int Y; } 思考:输出结果是什么?
  • 35. CPointX: 3Y: 3┊CPointX: 5Y: 10pts:CPoint[]┊5[0]arr1:int[][0]:1[1]:2[2]:4[1][2]2.2 引用类型——数组输出结果:5注意:当数组元素是引用类型时,初始化数组后还要初始化各个数组元素。
  • 36. 规则多维数组:数组元素连续存放,每一维的数组元素个数相同。定义时用逗号划分维数。 定义 int[,] a=new int[3,4]; int[, ,] a1=new int[3,2,3]; 初始化+赋值 int[,] a=new int[,]{ {0,0,1,1}, {1,1,2,2}, {2,3,4,5} }; 或简写为: int[,] a={ {0,0,1,1}, {1,1,2,2}, {2,3,4,5} }; 访问数组元素 a[0,1]=5; Console.WriteLine(a[1,2]); 2.2 引用类型——数组
  • 37. 不规则多维数组——可视为广义上的一维数组,其每个数组元素本身又是一个子数组,而且这些子数组的长度可以各不相同。 定义 int[][] b; int[][,] c; //定义数组 int[,,][][,] d; 初始化数组 b=new int[3][]; //初始化数组后要对各个子数组进行初始化 b[0]=new int[4]; b[1]=new int[3]; b[2]=new int[2]; 2.2 引用类型——数组
  • 38. 不规则多维数组 在不规则多维数组中存储的只是指向各个子数组的地址。2.2 引用类型——数组
  • 39. b[1]:int[3]135┊b[2]:int[2]5b:int[3][]b[0]b[1]b[2]a:int[3,4]a[0,0]:0a[0,1]:0a[0,2]:1a[0.3]:1a[1,0]:1a[1,1]:1a[1,2]:2a[1.3]:2a[2,0]:2a[2,1]:3a[2,2]:4a[2,3]:5┊10b[0]:int[4]24682.2 引用类型——数组
  • 40. 不规则多维数组 访问数组元素: Length属性:得到数组本身的长度(即子数组的个数) GetLength(0):得到数组本身的长度2.2 引用类型——数组int[][] b=new int[3][]; b[0]=new int[4]; b[1]=new int[3]; b[2]=new int[2]; Console.WriteLine(b.Length); //输出? Console.WriteLine(b.Length==b.GetLength(0)); //输出? Console.WriteLine(b.GetLength(1)); //正确吗? Console.WriteLine(b[0].Length); //输出?思考:能否将元素类型分别为int、float和double的三个数组放在一个多维数组中?