博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(一)
阅读量:4551 次
发布时间:2019-06-08

本文共 1452 字,大约阅读时间需要 4 分钟。

本章内容

  • 编程语言的基元类型

  • 引用类型和值类型

  • 值类型的装箱和拆箱

  • 对象哈希码

  • dynamic基元类型

本章目的

通过学习了解基元类型、引用类型和值类型的区别,希望让coder能避免引用一些不易察觉的bug,并提高性能。

 

编程语言的基元类型

1:  //分配一个整数
2:  System.Int32 a = new System.Int32();
3:  //C#中我们使用
4:  int a = 0;

如上代码,某些类型很常用,许多编译器允许简化他们的语法,而且生成的IL代码与使用System.Int32生成的IL代码完全一致。

编译器直接支持的数据类型称为基元类型(primitive type)

基元类型直接映射到Framework类库(FCL)中存在的类型,比如C#中,int直接映射到System.Int32类型,因此,以下4行代码都能正确编译,并生成完全一致的IL:

1:  int a = 0;//最方便
2:  System.Int32 a =0; //方便
3:  int a = new int();//不方便
4:  System.Int32 a = new System.Int32();//最不方便

对于都支持CLS(common language specification公共语言规范)的类型,VS的其他语言都将提供类似的基元类型。对于非CLS的类型不要求。

下图标明了C#中的对应FCL的基元类型:

在这里我们建议大家通常在使用类型的时候,使用FCL的类型名称,比如Int32 a = 0; String isaac = String.Empty等。

checked和unchecked基元类型操作

对基元类型执行的许多算术运算都可能造成溢出,如下:

1:  Byte b = 100;
2:  b = (Byte)(b+200);//b现在包含44(或者16进制2C)

在大多数情况下,这种悄然的溢出是我们不希望的。因为它会引起应用程序的异常。但在极少情况下,比如计算一个哈希值或者校验和,这种溢出是可接受的,甚至是希望的。

不同的语言对于溢出的处理不同,比如C/C++不认为溢出是个错误,而VB总是将溢出视为错误,检查到后会抛出异常。

C#允许程序员自己决定如何处理溢出,默认检查时关闭状态。C#通过提供checked和unchecked操作符来实现。如下:

//uncheckedUInt32 isvalid = unchecked((UInt32)(-1));//OK//checkedByte b = 100;b = checked((Byte)(b+200));//抛出OverflowExceptionorb = (Byte)checked(b+200);//b包含44,不会抛出异常了。。

除了checked和unchecked操作符之外,C#还支持checked和unchecked语句块,以便标识当前块中所有的表达式都进行或者不进行溢出检查:

checked{      Byteb = 100;      b = (Byte)(b+200);//这里要进行溢出检查}//因为用了checked块,就可以使用+=的简化代码checked{     Byte b = 100;     b+=200;}
 

转载于:https://www.cnblogs.com/zhangpan1244/archive/2013/03/10/2953204.html

你可能感兴趣的文章
thymeleaf:字符串拼接+输出单引号
查看>>
springboot:集成fastjson(教训)
查看>>
网络流 Edmons-Karp 算法讲解
查看>>
「NOIP2018模拟9.10」公约数 - 找规律 - gcd
查看>>
使用java理解程序逻辑(15)
查看>>
bzoj 1879 状压dp
查看>>
python 一些特殊用法和坑
查看>>
WIFI密码破解全攻略
查看>>
c++string各种函数
查看>>
errno.h含义
查看>>
字典树(模型体)
查看>>
盒模型详解
查看>>
bzoj2157 旅游
查看>>
bzoj5016 [Snoi2017]一个简单的询问
查看>>
poj2417 bzoj3239 Discrete Logging(bsgs)
查看>>
UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
查看>>
string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections...
查看>>
6月27日 ajax
查看>>
iOS开发之画图板(贝塞尔曲线)
查看>>
4嵌入式作业io
查看>>