<From C++ To C#> 更强大的值类型
上一节我们知道C#的int, double是一种类型,而类型本身可以包含成员变量成员函数,所以C#中的int除了普通赋值外还可以有.操作。
//int的最大值 int.MaxValue //double的绝对值 double.PositiveInfinity //bool的字符串表示 bool.FalseString //char是不是标点符号 char.IsPunctuation('?')
再介绍几个常用的值类型。
decimal也是个浮点数,它比double大一倍,比float大两倍。
还有两个很好用的值类型一个叫做DateTime代表日期,一个叫做TimeSpan代表时间间隔。
DateTime now = DateTime.Now;
DateTime today = new DateTime(2010,7,4);
TimeSpan ts = new TimeSpan(0,10,0);//十分钟
这两个没有昵称的也是值类型啊
值类型只是关心值本身,所以他们跟其他对象不同,比对的时候只是比对值本身,而不是比对对象的内存地址。这也跟C++的int, double用法保持一致了。
值类型也是没有NULL之说的。int只能赋值0,1,-1之类的值。不过有的时候我们确实希望对值类型也赋值null来加以区分。C#提供了?。我们只要把int改成int?就变成了一个可以赋值null的int类型了。其他值类型也是如此。
char? cc = null; bool? bb = null; float? ff = null; DateTime? dt = null;
我们最后再一起来研究一下类型转换。众所周知,把short隐式转换成一个int完全没有问题,反之则不然。由于int能够存储的内容比short多,所以如果你一定要转换,要提供一个强制转换。
short s = (short)IamInt;
short s = checked((short)i);
如果转换的时候确实引起了数据丢失,checked会抛出一个System.OverflowException来提醒你。
由于我对.操作提示出来的内容比较感兴趣,所以实际上我已经很少用(short)i,这种转换方式。而是采用了System.Convert.ToInt16(…)来做转换。Convert可以To很多种,而且To了很多种以后还包含各种转换参数。只要是.出来的东西我都比较放心。
还有一种转换方式是int.Parse(“1”); double.Parse(“1.11”);..他可以把字符串转换成相应的值类型,也是比较方便的。
其实大部分时候,尤其是页面编程的时候,我们需要做的转换都是字符串转数字,这样第一种强制转换是无法使用的。而且后面两种转换,如果不成功也会自动抛出异常。所以还是推荐大家用后面两种转换。