C#数据类型小结
在C#语言中,符合公共语言规范(CLS)的数据类型可分为两类:值类型和引用类型。
值类型变量直接保存变量的值,引用类型的变量保存的是数据(对象)的引用地址。
当把一个值变量赋给另一个值变量,会在栈中复制一个相同的值,每个变量的值都是独立的,因此对一个变量的操作不会影响到其他变量;
而把一个引用变量赋给另一个引用变量,则会在栈中复制对同一堆位置的引用,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,另一个变量也跟着改变。
1.值类型有
整型(sbyte,byte,short,ushort,int,uint,long,ulong)
浮点型(float,double,decimal)
布尔型(bool)
字符型(char)
枚举(enum)
结构(struct)
值类型包括可以再细分为简单值类型和复合型类型。
简单值类型包括整数类型、字符类型、实数类型和布尔类型,而复合类型则是简单类型的复合,包括结构(struct)类型和枚举(enum)类型。
1.1. 整型
C#中有9个整型。 sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char(单独一节讨论)。它们具有以下特性:
sbyte型为有符号8位整数,取值范围在128~127之间。 bytet型为无符号16位整数,取值范围在0~255之间。 short型为有符号16位整数,取值范围在-32,768~32,767之间。 ushort型为无符号16位整数,取值范围在0~65,535之间。 int型为有符号32位整数,取值范围在-2,147,483,648~ 2,147,483,647之间。 uint型为无符号32位整数,取值范围在 0 ~ 4,294,967,295之间。 long型为64位有符号整数,取值范围在9,223,372,036,854,775,808~ 9,223,372,036,854,775,807之间。 ulong型为64位无符号整数,取值范围在0 ~ 18,446,744,073,709,551,615之间。
和其它的编程语言相比,在C#中,int不再取决于一个机器的字(word)的大小,而long被设成64位。
C#程序中,每个整数类型都对应于System中的一个结构体,例如,整型int所对应的结构是System.Int32,每次定义一个int型的变量,实际上就创建了System.Int32结构的一个变量。这些结构中有一个常用的Parse方法可以进行数据类型转换。例如:
Console. Write("请输入圆的半径值:"); R=double.Parse(Console. ReadLine());
分析:ReadLine读入一行字符串,Parse方法就把string转换为其他基本类型。用double调用该方法就把string转换成double类型。
还有可以用ToString将数据转换为字符串,例如:
int i=int. MaxValue; string s=i.ToString( ); string s=l3.ToString( );
1.2 浮点型(实数)
C#提供了3种实数类型:单精度类型(float)、双精度类型(double)和十进制小数类型(decimal),它们的差别在于取值范围和精度:
float: 取值范围在 1.5x10^-45~ 3.4x10^38之间, 精度为7位数。 double: 取值范围在 5.0x10^-324 ~ 1.7x10^308之间, 精度为 15~16 位数。 decimal:取值范围从大约1.0x10^-28 到 7.9x10^28,具有28至29位有效数字,小数型是一种高精度、128位数据类型,它打算用于金融和货币的计算。
C#默认的字面上的实数是double类型,要声明float和decimal类型,还需要在小数后面加上后缀F和M,例如:1.2; 1.2F; 1.2M。float、double和decimal类型实际分别代表了System.Single、System.Double和System.Decimal结构。
decimal的取值范围比double的还窄,但它更精确。因此,没有decimal和double之间的隐式转换——往一个方向转换可能会溢出,往另外一个方向可能会丢失精度。你不得不运用显式转换。
当用浮点型执行运算时,可以产生以下的值:
- 正零和负零
- 正无穷和负无穷
- 非数字值(Not-a-Number,缩写NaN)
- 非零值的有限数集
另一个运算规则为,当表达式中的一个值是浮点型时,所有其它的类型都要被转换成浮点型才能执行运算。
1.3 布尔型
布尔类型(bool )表示布尔逻辑量,取值只能是true或者false,表示“真”和“假” 这两个概念。
bool b1=true; bool b2=false;
C#中的bool类型对应于System.Boolean结构。虽然只有两个取值,但它占4个字节。布尔类型和其他数值之间不存在任何对应关系。不能认为整数0是false,其他值是true,bool x=1 是错误的。
布尔数据类型有true和false两个布尔值。可以赋于true或false值给一个布尔变量,或可以赋于一个表达式,其所求出的值等于两者之一:
- bool bTest = (80 > 90);
与C和C++相比,在C#中,true值不再为任何非零值。不要为了增加方便而把其它整型转换成布尔型。
1.4 字符型
字符型为一个单Unicode 字符。一个Unicode字符16位长,它可以用来表示世界上多种语言。可以按以下方法给一个字符变量赋值:
char chSomeChar = 'A';
除此之外,可以通过十六进制转义符(前缀\x)或Unicode表示法给变量赋值(前缀\u):
char chSomeChar = '\x0065'; char chSomeChar = '\u0065';
不存在把char转换成其它数据类型的隐式转换。这就意味着,在C#中把一个字符变量当作另外的整数数据类型看待是行不通的——这是C程序员必须改变习惯的另一个方面。但是,可以运用显式转换:
char chSomeChar = (char)65; int nSomeInt = (int)'A';
在C中仍然存在着转义符(字符含义)。请看下列。
\' 单引号 \" 双引号 \\ 反斜杠 \0 空字符 \a 感叹号(Alert ) \b 退格 \f 换页 \n 新行 \r 回车 \t 水平 tab \v 垂直tab
1.5 枚举类型
RT:老师说 枚举是--为不可分的整数值提供便于记忆的符号.什么意思呢?
枚举是程序员定义的类,是值类型;
枚举类型的元素使用的类型只能是long,int,short,byte。默认类型是int。默认第一个元素的值是0,每一个连续的元素按1递增。不能对成员使用修饰符;
enum color { black, white, red, blue, green }; //可以给元素直接赋值。如: enum monthnames { January=1, February, march=31 }; //可以强制定义其他类型,如: enum monthnames : byte { January, February, March };
1.计算机在处理的时候,实际上black=0,white=1,red=2,blue=3,green=4; 这些类似于#define black 0 只是用black代表了0而已。
2.为什么说不可分呢,一般情况下3=1+2,但是blue不等于white+red;所以这些代表用的符号虽然实际上是整数,但是不能像一般整数那样拆分。
3.继续:
color color1;
color1 = white;
上面定义的color是一个类型名(像int、float那样是类型名),可以定义变量,color1是这种类型的一个变量,它等于white,实际上计算机处理的时候它就等于1,这是由enum color的定义决定的。
1.6 结构类型
把一系列相关的信息组织成为一个单一实体的过程,这就是创建一个结构的过程。
一个结构类型可以声明构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型。尽管列出来的功能看起来象一个成熟的类,但在C#中,结构和类的区别在于结构是一个值类型,而类是一个引用类型。如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
使用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等。你可以节省内存,因为没有如类对象所需的那样有额外的引用产生。例如,当声明含有成千上万个对象的数组时,这会引起极大的差异。
包含一个命名为IP的简单结构,它表示一个使用byte类型的4个字段的IP地址。我不包括方法等,因为这些工作正如使用类一样,将在下一章有详细的描述。
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); } }
结构可以实现接口,但它们无法继承另一个结构,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以没有abstract和sealed 不能用protected修饰, 并且可以不用new初始化,结构中不能初始化字段。
2.引用类型有
- 对象类型(object)
- 类(class)
- 接口(interface)
- 委托(delegate)
- 字符串(string)
- 数组(array)
string
虽然字符串类型是引用类型,但微软为了我们设计方便,重载了其中的一些操作符,使得它应用起来就像是值类型一样。
*简化符号*
简单类型就是组成应用程序中基本构件的类型。简单类型与复杂类型不同没有子类型或特性。大多数简单类型都是存储数值的。
C#中出现的简单类型共享一些特性。
第一,它们都是.NET系统类型的别名。
第二,由简单类型组成的常量表达式仅在编译时而不是运行时受检测。
第三,最后,简单类型可以按字面被初始化。
C#简化符号 | 系统类型 | 范围 | 作用 |
整型(sbyte,byte,short,ushort,int,uint,long,ulong) | SByte,Byte ...... Int64,UInt64 | -263 264 | 整数 |
float | System.Single | 1.5*10-45-3.4*1038 | 32位浮点数 |
double | System.Double | 5.0*10-324-1.7*10308 | 64位浮点数 |
demcimal | System.Demcimal | 1.0*10-28-7.9*1028 | 128位十进制带符号数 |
bool | System.Boolean | true or false | 用来表示“真”和“假” |
char | System.Char | U+0000 ~ U+ffff | 一个16位的Unicode字符 |
string | System.String | 受系统内存限制 | 一个16位的Unicode字符集合 |
object | System.Object | 任何类型都可以保存在一个object变量中 | 。Net世界所有类型的基类 |
编辑中...