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值给一个布尔变量,或可以赋于一个表达式,其所求出的值等于两者之一:

  1. 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世界所有类型的基类

 编辑中...

posted @ 2013-05-09 15:01  花落红尘  阅读(659)  评论(0编辑  收藏  举报