编程语言的基元类型 - 编译器直接支持的数据类型
基元类型直接映射到Framework类库(FCL)中存在的类型
int a1 = 0; System.Int32 a2 = 0; int a3 = new int(); System.Int32 a4 = new System.Int32();
C#基元类型:
编译器能执行基元类型之间的隐式或显示转换。只有在转换“安全”的时候,C#允许隐式转换。所谓“安全”,是指不会发生数据丢失的情况。“不安全”意味着在转换之后,有可能丢失精度或者数量级。
除了转型,基本类型还能写成文本常亮。
Console.WriteLine(123.ToString() + 456.ToString()); //"123456"
checked和unchecked基元类型操作
对基元类型执行的许多算术运算都可能造成溢出。
Byte b = 100; b = (Byte)(b + 200); Console.WriteLine(b); // 44 Console.ReadLine();
让C#编译器控制溢出的一个办法是使用/checked+编译器开关。这个开关只是编译器在生成代码是,使用加、减、乘和转换指令的溢出检测版本。除了全局性的打开或关闭溢出检测,程序员还可以在代码的指定区域控制溢出检测。
UInt32 invalid = unchecked((UInt32)(-1)); Console.WriteLine(invalid); Console.ReadLine();
UInt32 invalid = checked((UInt32)(-1)); // OverflowException Console.WriteLine(invalid); Console.ReadLine();
checked { Byte b = 100; b = (Byte)(b + 200); }
引用类型和值类型
class Program { static void Main(string[] args) { SomeRef r1 = new SomeRef(); //在堆上分配 SomeVal v1 = new SomeVal(); //在栈上分配 r1.x = 5; v1.x = 5; Console.WriteLine(r1.x); Console.WriteLine(v1.x); SomeRef r2 = r1; // 5 SomeVal v2 = v1; // 5 r1.x = 8; v1.x = 9; Console.WriteLine(r1.x); // 8 Console.WriteLine(r2.x); // 5 Console.WriteLine(v1.x); // 9 Console.WriteLine(v2.x); // 5 Console.ReadLine(); } } //引用类型,由于使用了‘class’ class SomeRef { public Int32 x; } //值类型,由于使用了'struct' struct SomeVal { public Int32 x; }