【C#】数据类型
(sbyte,byte,short,ushort,int,uint,lon。。。
  C#的数据类型可以分为3类:数值类型,引⽤类型,指针类型。指针类型仅在不安全代码中使⽤。
  值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型。引⽤类型包括类类型,接⼝类型,代表类型和数组类型。
  值类型和引⽤类型的不同之处是值类型的变量值直接包含数据,⽽引⽤类型的变量把它们的引⽤存储在对象中。对于引⽤类型的变量,完全有可能让两个不同的变量引⽤同⼀个对象,这样⼀来,对其中⼀个变量的操作就会影响到被另⼀个变量引⽤的对象。对于值类型的变量⽽⾔,每⼀个变量有它们⾃⼰的数值,因此对其中⼀个变量的操作不可能影响到另外⼀个变量。
1 值类型
  所有的值类型都隐含地声明了⼀个公共的⽆参数的构造函数,这个构造函数叫做默认构造函数。默认构造函数返回⼀个初始为零的值类型的实例,称之为默认值。
  对于sbyte,byte,short,ushort,int,uint,long,ulong,默认值为0。
  对于char,默认值是'\x0000' ,对于float,默认值是0。0F 对于double,默认值是0。0D 对于decimal,默认值是0。0M 对于bool,默认值是false 对于⼀个枚举类型,默认值是0 对于⼀个结构类型,默认值的设置就是把所有值类型的域都设置为它们各⾃的默认值,把所有的引⽤类型的域赋为空
  1.1 简单类型
  C#提供⼀套预定义的结构类型叫做简单类型。简单类型⽤保留字定义,这些保留字仅仅是在System名字空间⾥预定义的结构类型的化名。⽐如int是保留字,System。Int32是在System名字空间中预定义类型。⼀个简单类型和它化名的结构类型是完全⼀样的,也就是说写int和写System。Int32是⼀样的。简单类型主要有整型,浮点类型,⼩数类型,布尔类型,字符型 
  1.1.1 整型
float型  C#中⽀持9种整型:sbyte,byte,short,ushort,int,uint,long,ulong和char。
  Sbyte:代表有符号的8位整数,数值范围从-128 ~ 127
  Byte:代表⽆符号的8位整数,数值范围从0~255
  Short:代表有符号的16位整数,范围从-32768 ~ 32767
  ushort:代表有符号的16位整数,范围从0 到 65,535
  Int:代表有符号的32位整数,范围从-2147483648 ~ 2147483648
  uint:代表⽆符号的32位整数,范围从0 ~ 4294967295
  Long:代表有符号的64位整数,范围从-9223372036854775808 ~ 9223372036854775808
  Ulong:代表⽆符号的64位整数,范围从0 ~ 18446744073709551615。
  char:代表⽆符号的16位整数,数值范围从0~65535。 Char类型的可能值对应于统⼀字符编码标准(Unicode)的字符集。
  Char类型与其他整数类型相⽐有以下两点不同之处: a,没有其他类型到char类型的隐式转换。即使是对于sbyte,byte和ushort这样能完全使⽤char类型代表其值的类型,
sbyte,byte和ushort到char的隐式转换也不存在。 b,char类型的常量必须被写为字符形式,如果⽤整数形式,则必须带有类型转换前缀。
  ⽐如(char)10赋值形式有三种: char chsomechar="A"; char chsomechar="\x0065"; ⼗六进制 char chsomechar="\u0065 ;
  unicode表⽰法字符型中有下列转义符: 1,\'⽤来表⽰单引号 2,\"⽤来表⽰双引号 3,\\ ⽤来表⽰反斜杠 4, \0 表⽰空字符 5, \a ⽤来表⽰感叹号 6, \b ⽤来表⽰退格 7, \f ⽤来表⽰换页 8, \n ⽤来表⽰换⾏ 9, \r ⽤来表⽰回车 10, \t ⽤来表⽰⽔平tab 11, \v ⽤来表⽰垂直tab
  1.1.2 浮点类型
  C#⽀持两种浮点类型:float和double。
  Float型所能表⽰的值的范围⼤约可以从1.5*10 -45~3.4* 10 38,精确到⼩数点后⾯7位。
  Double型所能表⽰的值的范围⼤约可以从5.0*10 -324~1.7* 10 308,精确到⼩数点后⾯15位或16位。如果⼆元操作中的其中⼀个操作数为浮点类型,那么另外⼀个操作数是整型或浮点类型,运算规则如下: a,如果其中⼀个操作数是整型,则操作数被转换为另⼀个操作数的浮点数类型; b,如果操作数之⼀为double,则另⼀操作数也被转换成double类型,运算以double类型的精度和取值范围进⾏,并且所得结果也为double类型; c,否则,运算⾄少将以float类型的取值范围和精度进⾏,并且所得结果也为float型。
  1.1.3 ⼩数(decimal)类型
  ⼩数类型⾮常适⽤于⾦融和货币运算。数值范围从1.0*10 -28~7.9* 10 28,精确到⼩数点后⾯28位。
如果⼆元操作中的其中⼀个操作数是⼩数类型,那么另外⼀个从操作数是整型或⼩数类型。整型在运算前被转化为⼩数类型数。如果⼀个⼩数类型的算术运算产⽣了⼀个对于⼩数类型的格式来说太⼩的值,操作的结果将会变成0。如果⼀个⼩数类型的算术运算产⽣了⼀个对于⼩数类型的格式来说太⼤的值,就会触发溢出错误。⼩数类型较浮点类型⽽⾔,具有更⼤的精确度,但是数值范围相对⼩了很多。将浮点类型的数向⼩数类型的数转化时会产⽣溢出错误,将⼩数类型的数向浮点类型的数转化时会造成精确度的损失。因此,两种类型不存在隐式或显式转换。布尔型:值为true或false。没有标准能实现布尔类型和其他类型的转换。
1.2 枚举类型枚举类型的元素使⽤的类型只能是long,int,short,byte。默认类型是int。默认第⼀个元素的值是0,每⼀个连续的元素按1递增。可以给元素直接赋值。如:
enum monthnames
{
  January=1,
  February,
  march=31
};
可以强制定义其他类型,如:
enum monthnames : byte
{
  January ,
  February,
  March
};
enum monthnames
{
  January=1,
  February,
  march=31
};
可以强制定义其他类型,如:
enum monthnames : byte
  January ,
  February,
  March
};
  1.3结构类型
  结构类型也是⼀种值类型,使⽤它的⽬的是⽤于创建⼩型的对象,⽤以节省内存。下⾯的例⼦表⽰⼀个使⽤byte类型的4个字段的IP地址。
using System;
Struct IP //声明结构
{
  publicbyte b1,b2,b3,b4;
}
Class test
{
publicstaticvoid Main()
{
IP myIP;
myIP.b1=192;
myIP.b2=168;
myIP.b3=1;
myIP.b4=101;
Console.Write("{0}.{1}。", myIP.b1, myIP.b2);
Console.Write("{0}.{1}", myIP.b3, myIP.b4);
 }
}
using System;
Struct IP //声明结构
{
  public byte b1,b2,b3,b4;
}
Class test
{
public static void Main()
{
IP myIP;
myIP.b1=192;
myIP.b2=168;
myIP.b3=1;
myIP.b4=101;
Console.Write("{0}.{1}。", myIP.b1, myIP.b2);
Console.Write("{0}.{1}", myIP.b3, myIP.b4);
}
}
2 引⽤类型
  引⽤类型包括类类型,接⼝类型,代表类型和数组类型。
  2.1 类类型类类型定义了⼀种数据结构,这个数据结构中包含了数据成员(如常量,字段和事件等),函数成员(如⽅法,属性,索引,操作,构造函数和析构函数等)和嵌套类型。⽀持继承。 2.2 对象类型对象类型是其他所有类型最终的基础类型。在C#中每⼀种类型都直接或者间接的源于object这个类类型。
  2.3 字符串类型字符串类型是直接从object中继承⽽来的密封类。String类型的值可以写成字符串⽂字的形式。
  2.4 接⼝类型⼀个接⼝声明⼀个只有抽象成员的引⽤类型,接⼝仅仅存在⽅法标志,但没有执⾏代码。
当定义⼀个类时,如果类从接⼝派⽣,可以派⽣⾃多重接⼝;但是如果类从类派⽣,就只能从⼀个类派⽣。声明⽅法如例:
interface iface
{
 void showmyface();
}
interface iface
{
void showmyface();
}
  2.5 代表类型
  代表引⽤⼀种静态的⽅法或者对象实例,引⽤该对象的实例⽅法。与其接近的是c/c++中的指针,但指针只能访问静态的函数,代表既能访问静态的⽅法,也能访问实例的⽅法。
  2.6 数组数组是包含⼀串变量的数据结构。数组变量也称做数组元素,它们具有相同的类型,这种类型也称做数组元素类型。数组的元素类型可以是任何类型,包括数组类型。数组⽤下标确定每⼀个数组元素的索引号。只有⼀个下标的数组称为⼀维数组,多于⼀个下标的数组称为多维数组。
  例:int[] a={0,2,4,6,8}; 等价于int[] a=new int[] {0,2,4,6,8}; 也可以这样初始化:a[0]=0; a[1]=2; a[2]=4; a[3]=6; a[4]=8;
  int[] a; //int型的⼀维数组
  int[,] a;int型的⼆维数组
  int[,,] a; //int型的三维数组
  int[] []a; //int型的数组的数组
  int[][][]a; //int型的数组的数组的数组
  数组的每个维数的长度不是数组类型的⼀部分,维数的长度是在数组创建语句中指定的,⽽不是在数组类型中指定的,
  例如: int[,,] a3=new int[10,20,30]; a3是是⼀个数组变量, int[,,] 没有指定数组的长度,数组创建语句new int[10,20,30]才指定。
  下⾯的例⼦创建⼀个数组的数组:
  int[][] J=new int[3][];
  J[0]=new int[] {1,2,3};
  J[1]=new int[] {1,2,3,4,5,6};
  J[2]=new int[] {1,2,3,4,5,6,7,8,9};