二、C# 数据类型

C#语言的基本类型包括8种整数类型、2种用于科学计算的二进制浮点类型、1种用于金融计算的十
进制浮点类型、1种布尔类型以及1种字符类型。
2.1 基本数值类型
C#中的基本数据类型都有关键字和它们关联
C#的所有基本类型都有一个短名称和一个完整名称。完整名称对应于BCL中命名的类型。这个名称在所有语言
中都是相同的,而且它对程序集里的类型进行了惟一的标识。因为基本数据类型是其他类型的基础,
所以C#为基本数据类型的完整名称提供了短名称或者缩写。其实从编译器的角度看,两种名称是完全一样
的,最终都将生成同样的代码。
 
2.1.2 浮点类型
浮点数的精度是可变的。如果读取本来是0.1的一个浮点数,那么可能很容易读取成0.099999999或者
0.100000001或者其他非常接近0.1的一个数.
float  有效数字7位  32bit
double 有效数字15-16位64bit
2.1.3 decimal类型
128bit  有效数字 28-29位,
与浮点数不同,decimal类型保证范围内的所有十进制数都是精确的。
比浮点数的精度高,但是范围小。
decimal类型的基数是十进制的,浮点类型的基数是二进制的。
 
2.1.4字面值
直接将一个值放到源代码中的行为称为硬编码,因为所以若是更改了值,就必须重新编译代码。一般可以
考虑丛个外部来源获取值,比如从一个配置文件中,这样一来,以后需要修改时候,就不需要重新编译代码了。
system.console.writelin(100);
 
 
2.2更多基本类型
 
bool char string
 
 
字符串
注:@
 
属性具有赋值方法和聚会方法的特殊方法,但是要使用字段的语言来访问那些方法。
 
string类型是不可变的,没有机制可供修改一个字符串的内容。只能重新赋值。
 
StringBuilder
当大量字符串需要修改,使用StringBulider 会修改变量中的数据,而不是返回一个新的字符串。
 
 
2.3 null 和 void
 
与类型有关的两额外的关键字是null和void。
null值表明变量不引用任何有效的对象,void表示没有类型,或者没有任何值。
1、null
null值只能赋给引用类型、指针类型和可空值类型。
从而使引用不指向任何位置。
没有赋值的引用与赋值null的引用不同。
没有赋值的引用,指向一个位置,但是通常不清楚该引用指向的位置,会造成内存访问的冲突之类的。
赋值null的引用,表明不指向任何位置。
 
2、void
void本质并不是一个数据类型,它只是用于指出没有数据类型这一事实。
 
隐式类型(匿名类型 anonymous type)的局部变量:C# 3.0添加了一个上下文关键字var,
它用于隐式类型的局部变量,只要代码在声明的同时初始化一个变量,就允许变量的数据类型是隐式的,但是生成 的CIL代码中,数据类型是固定(根据初始化的值判定)。
代码:
         
1             System.Console.Write("Enter Text:");
2             var text=System.Console.ReadLine();
3  
4             var uppercase = text.ToUpper();
5             System.Console.WriteLine(uppercase);
6             var patent1 = new { Title = "title1", Content = "content1" };
7  
8             Console.WriteLine(patent1.Title + "," + patent1.Content);   

 

这种形式的操作是连接数据类型的关键,同时还能将特定的类型缩减为更少的数据元素,从而有效地
减少类型的大小。
 
2.4 类型的分类
所有类型都可以划分为两类:值类型和引用类型。它们的区别来源于它们的复制方式:值类型的数据问题
总是值被复制放到一块新的内存当中,而引用类型总是内存地址被复制到新一引用上。
 
值类型的变量直接包含值,也就是说变量引用的位置就是值在内存中实际存储的位置(直接寻址)。
 
引用类型和引用它们它们的变量指向数据存储位置(间接寻址),引用类型并不直接存储数据实际值,而是存储了此实际数据存放地(某一块内存当中)的内存首地址。
为了访问实际数据,运行时 要从引用类型的变量中读取此内存位置,然后再到此内存区域取得实际数据。
 
引用类型指向的内存区域称为堆(heap)。使用new申请的
引用类型实际保存的数据就是一个整型数据,根据处理器32位 或者  64位
 
 
2.5可空修饰符
一般来说,null值不能赋给值类型。因为值类型不能包含引用。
为了声明可以存储null的变量,要使用可空修饰符 ?
将null赋给值类型,这在数据库编程中尤为有用,在数据表中,经常出现值类型的列允许为空的情况
 
如:
int? count=null;
 
2.6数据类型之间的转换
有可能造成丢失数量级或者引发异常的任何转换都需要执行显式转型。
不会丢失数量级,而且不会引发异常的任何转换都属于隐式转型。
 
2.6.1显式转型
使用转型运算符
如:
            long longNumber = 21512351235;
            int intNumber = (int)longNumber;
注:checked和unchecked转换
在checked块内,如果在运行时发生一次溢出的赋值,就会引发一个异常。
在unchecked块内,如果发生溢出,它会将数据截断,而不是为块中的赋值引发异常。
 
注:C#不存在从一个数值类型到一个布尔类型的有效类型。
 
2.6.2隐式转型
无需使用转型运算符。
 
2.6.3 不进行转换的类型转换
由于没有定义从字符串到数值类型的转换,因此需要使用像Parse()这样的方法,每个数值数据类型都包含
一个Parse()方法,它允许将字符串转换成对应的数值类型。
如:
            string cc= "9.11E-31";
            float a = float.Parse(cc);
还有一种特殊类型,可以利用它将一种类型转换成另一种类型。Convert
不过Convert只支持预定义的数据类型(基本类型),而且是不可扩展。它允许从任何基本类型转换到
其他基本类型。
 
注:TryParse()
            string cc = "9.11E-31";
            float result;
            float.TryParse(cc, out result);
Parse()和TryParse()区别在于,
1、Parse返回转换后的数据,并且如果转换失败,会引发异常
2、TryParse返回值是一个布尔值,代表是否转换成功,并且如果转换失败,并不会引发异常
 
 
2.7数组
数组的声明
一维数组
数据类型[ ]    数组名;
 
二维数组
数据类型[ , ]    数组名;
 
多维数组
数据类型[ , ,,,]    数组名;
 
交叉数组
数组类型[][] 数组名
 
注:交叉数组的每一个元素是一个数组(必须使用new来初始化)。
 
数组的实例化和赋值
1、声明数组的同时进行赋值
            string[] languages = { "C#", "COBOL", "JAVA", "C++", "Visual Basic" };
            只有在同一个语句声明并赋值时才可以省略new,如果是在声明之后才进行赋值,则需要使用new关键字和对应的数据类型
 
2、声明之后再进行数组赋值
    string[] languages;
            languages=new string[]{ "C#", "COBOL", "JAVA", "C++", "Visual Basic" };
            自C#3.0起,不必在new后面指定数组的数据类型,只要数组元素的数据类型是兼容的即可,但是方括与仍是需要的。
 
3、声明的同时使用new进行数组赋值
C#还支持将new关键字作为声明语句的一部分使用
 string[] languages = new string[] { "C#", "COBOL", "JAVA", "C++", "Visual Basic" };
使用new关键字,会让 运行时 为数据类型分配内存。
 
4、使用new关键字进行声明和赋值,并指定大小。
不论何时用new关键字作为数组赋值的一部分,都可以同时在广播号内指定数组的大小。
string[] languages = new string[5] { "C#", "COBOL", "JAVA", "C++", "Visual Basic" };
 
5、分配数组,但不指定初始值
string[] languages = new string[5];
分配一个数组但不指定初始值仍然会初始化每个元素。运行时 会将每个元素初始化为它们的默认值。
引用类型:null
数值类型:0
bool:false
char:'\0'
6、在运行时定义数组大小
size在运行时指定;
new string[size];
 
 
二维数组的初始化
            int[,] cells = new int[,] {
            { 1, 2, 3 },
            { 4, 5, 6 }
            };
            int[,] cells =  {
            { 1, 2, 3 },
            { 4, 5, 6 }
            };
 
注:且大小不一致的多维数组会造成错误;
 
交叉数组:
  int[][] cells = new int[][] {
                new int[] { 1, 2, 3 },
                new int[] { 4, 5, 6, 7 }
            };
 int[][] cells = {
                new int[] { 1, 2, 3 },
                new int[] { 4, 5, 6, 7 }
            };
数组的属性和方法
1、长度
Length 数组的长度是固定的,不能随便更改,除非重新创建数组。
对于交错数组,Length返回的是外部数组的元素数-----交错数组是由数组构成的一个数组,所以Length
只用于外部数组,统计它的元素数(也就是具体由多少个数组构成 ).
2、方法
静态方法Sort() BinarySearch() Reverse() 和 Clear()等。
实例方法:GetLength() Rank Clone()
 
2.7.4字符串可作为数组使用
但是也是不可变的数组。
 
 
posted @ 2015-05-12 15:29  TLXXM  阅读(424)  评论(0编辑  收藏  举报