5.1
基元类型
 
编译器直接支持的数据类型称为基元类型(primitive type)。
以下4行到吗生成完全相同的IL
            int             a = 0;                  //最方便的语法
            System.Int32    b = 0;                  //方便的语法
            int             c = new int();          //不方便的语法
            System.Int32    d = new System.Int32(); //最不方便的语法 
C#基元类型与对应的FCL类型

C#中的基元类型

FCL类型

是否与CLS兼容

描述

sbyte

System.SByte

N

有符号8位值

byte

System.Byte

Y

无符号8位值

short

System.Int16

Y

有符号16位值

ushort

System.UInt16

N

无符号16位值

int

System.Int32

Y

有符号32位值

uint

System.UInt32

N

无符号32位值

long

System.Int64

Y

有符号64位值

ulong

System.UInt64

N

无符号64位值

char

System.Char

Y

16Unicode字符(不像非托管C++中那样,char表示的是一个8位值)

float

System.Single

Y

IEEE32位浮点数

double

System.Double

Y

IEEE 64位浮点数

bool

System.Boolean

Y

一个True或者Flase

decimal

System.Decimal

Y

128位高精度浮点值,通常用于不容许有摄入误差的金融计算场合。在这128位中,1位表示浮点值的符号,96位表示浮点值本身(一个整数值,小数点位置由下面8个位来确定),8位表示用96位值除以浮点值所得结果的10的幂次(0~28)。其余的位尚未使用

string

System.String

Y

一个字符数组

object

System.Object

Y

所有类型的基类型

dynamic

System.Object

Y

对于CLR, dynamic 和 object 完全一致。然而,C#编译器允许使用一个简单的语法,让dynamic变量参与动态调度。



checked 和 unchecked 的建议

  • 尽量使用有符号的数值类型(比如 Int32 和 Int64),而不要使用无符号的数值类型(比如 UInt32 和 UInt64),这允许编译器检测更多的上溢/下溢错误。
  • 如果代码发生不希望的溢出(可能因为无效的输入数据发生的),就把这些代码放在 checked 块中。同时还应捕捉 OverflowException。
  • 将允许发生溢出的代码显示的放在一个 unchecked 块中,比如一个计算校验和(checksum)的时候。

 

5.2
引用类型和值类型
 
引用类型

任何称为类的类型都是引用类型。
  • 引用类型总是从托管堆上分配
  • 对象中的其他字节总设为零
  • 从托管堆上分配一个对象时,可能强制执行一次垃圾收集操作
值类型

所有值类型都称为结构或枚举。
  • 值类型一般在线程栈上分配
  • 值类型并不包含一个指向实例的指针,相反,它包含了实例本身的字段,
  • 值类型的实例不受垃圾回收站的控制
  • 所有结构都是 System.ValueType 直接派生类,所有枚举都是从 System.Enum 的抽象类派生,后者又是从 System.ValueType 派生
值类型对象有两种表现形式:未装箱(unboxed)与已装箱(boxed),相反,引用类型总是处于已装箱形式。
5.3
值类型的装箱和拆箱
 

    struct Point
    {
        public Int32 x, y;
    }

    public sealed class Program1
    {
        public static void Main()
        {
            ArrayList a = new ArrayList();
            Point p;
            for (int i = 0; i < 10; i++)
            {
                p.x = p.y = i;
                a.Add(p);  //对值类型进行装箱,并将引用添加到 ArrayList 中
            }

            Console.Read();
        }
    } 
Add 需要获取对托管堆的一个对象引用(或指针)作为参数。这里的 P 是一个结构(值类型),所以要使用装箱(boxing)。
在装箱操作时内部发生的事情:


 

1.在托管堆中分配内存。分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类型对象指针和同步索引块)需要的内存量。

2.值类型的字段赋值到新分配的堆内存。

3.返回对象的地址。值类型现在是一个引用类型。



相关文章:

  • 2021-08-14
  • 2021-06-11
  • 2021-07-06
  • 2022-03-04
  • 2021-11-02
  • 2021-08-20
  • 2021-11-01
  • 2022-12-23
猜你喜欢
  • 2022-01-22
  • 2021-06-05
  • 2021-12-14
  • 2021-05-03
  • 2021-12-01
  • 2022-12-23
相关资源
相似解决方案