3echo

心有多大,世界便有多大!
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

C#学习笔记之类型篇

Posted on 2006-03-16 09:33  3echo  阅读(1328)  评论(0编辑  收藏  举报
 

C#学习笔记之类型篇

一、基元类型:

1、基元类型:编译器直接支持的数据类型称为基元类型。

C#中的基元类型:sbyte(8)byte(8)short(16)ushort(16)int(32)uint(32)long(64)ulong(64)char(16)float(32)double(64)bool(True or False)decimal(128)object(基类型)string(字符数组)

2CheckedUnchecked基元类型操作:(针对算术溢出)

    Byte b = 100;
   
=(Byte) (b + 200)    // b的值将为44(溢出)Byte(0¬——255)

注意:1CLR只在32位和64位值上进行算术运算。所以,b200首先会被转换为32的值,然后相加。C#不会隐式将高位从低位转型,所以第二行代码要显式进行Byte转型操作。

2Checked操作符和语句只影响加、减、乘、以及转换IL指令产生的版本;在checked操作符或语句内调用一个方法不会对该方法产生任何影响。  

// Checked操作符:
B=checked (( Byte ) ( b +200));   // 抛出OverflowException错误

// Checked语句:
checked {
    Byte b
=100;
    B 
= ( Byte ) (b+200);        // 溢出检查
}

3、  使用原则:

如果希望在出现溢出时抛出异常,我们就应该显式使用checked.

如果不希望有异常抛出(即使出现了溢出),就应该显式使用unchecked.

二、引用类型与值类型:

1、引用类型:

a、内存必须从托管堆中分配。

b、每个在托管堆中分配的对象都有一些与之关联的额外附加成员必须被初始化。

c、从托管堆中分配对象可能会导致执行垃圾收集。

dSystem.Object类、Sytem.Exception类、System.IO.FileStream类、System.Random类等等

2、值类型:值类型实例通常分配在线程的堆栈上,不受垃圾收集器的控制,所有值类型都必须继承自System.ValueType类型.

System.Boolean结构、System.Decimal结构、System.TimeSpan结构、System.DayOfWeek枚举、System.IO.FileAttributes枚举、以及System.Drawing.FontStyle枚举都是值类型。

三、装箱与拆箱(针对值类型,引用类型总是装箱形式)

Static void Main()
{
    Point p;
    p.x 
= p.y = 1;
    
object o = p;        // 对p进行装箱;o指向已装箱对象

    
//    将Point的x字段改为2
    P= ( Point ) o ;        // 对o进行拆箱,并将字段从托管堆拷贝到堆栈上
    p.x    =    2;
    o 
= p;
}

注意:装箱与拆箱/拷贝操作会从速度和内在两方面损伤应用程序的性能。因此我们应该清楚编译器会在何时自动产生执行这些操作的指令,并使我们编写的代码尽可能地减少导致这种情况的机会。

明白装箱与拆箱机制对于我们编写正确的代码,使系统性能优化会起到重要的作用。