简单的介绍了 C# 常用的数据类型以及相关需要注意的操作,看了不会成为大牛,但可以很快的入门。
常见数据类型C#的类型一般分为值类型、引用类型两大类型。
值类型的实例存放在栈中,引用类型会在栈中放置一个指针指向堆中的某一块内容。
C#为我们内置了几个数据类型供我们使用:
关键词简写对应的类全称(点击可以查看对应的 API)值范围说明boolSystem.Boolean
true、false该类型只有两个值,用作判断,表示“是”、“否”
sbyteSystem.SByte
-128 ~ 127 (-27~27-1)该类型在内存中使用 8 个 bit 进行存储,而且带有符号。
根据最高位作符号位,所以 sbyte 实际表示范围为 -128~127
byteSystem.Byte
0~28-18 位的无符号 bit
shortSystem.Int16
-215~215-1short 表示一个 16 位的短整形,其具体的值为-32768~32767
ushortSystem.UInt16
0~216-1ushort 表示无符号 16 位的短整型,具体的范围为 0~65535
intSystem.Int32
-215~215-1int 是我们常用的一个数据类型,它的数据范围为: -2,147,483,648~ 2,147,483,647 。
可以看到,是-2 亿到 2 亿,基本满足了数据需要。
uintSystem.UInt32
0~232-1uint 无符号整形,最大值比 int 大一倍左右,但是没有负数。
如果在计算中能保证没有负值,可以使用。
并不推荐,因为在做减法的时候,更、容易溢出
longSystem.Int64
-216~216-1实际取值为-9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 。
long 在内存中比 int 占用更多字节,长度为 int 的两倍。
所以能表达更多的数剧。在数据库中,经常被用来做大数据表的主键。
ulongSystem.UInt64
0~264-164 位无符号长整形,理同其他的无符号整形,在正整数中比 long 表达更多的数据。
charSystem.Char
utf-16在.net 中 char 表示 utf-16 的编码单位,所以绝大多数的字符都可以用 char 表示,包括中文汉字。
floatSystem.Single
-3.402823e38~3.402823e3832 位的单精度浮点型,也就是通常说的带小数点的数
doubleSystem.Double
64 位双精度浮点型,比 float 能表示更多的小数位。
实际取值-1.79769313486232e308~1.79769313486232e308
decimalSystem.Decimal
128 位高精度浮点值。
常用于不能四舍五入,或者对小数点后数字要求很敏感的地方。
在 128 位中,一位是符号位(表示正负),96 位是值本身(N),8 位是比例因子(k)。
所以 decimal 实际值应该是
±Nx10k,其中-28≤k≤0.其余位暂时没有使用
stringSystem.String
--字符串变量,表示一组字符数组。字符串是不可变量。即字符串不能修改,任何针对字符串的修改都会生成一个新的字符串。
另外的两个特殊类型:dynamic
object
。其中 dynamic 表示动态类型,这是 C#在 4.0 开始支持的,dynamic
关键字声明该变量名是个动态变量。具体使用参照 Python,Js 之类的动态语言。但是dynamic
声明的变量不支持添加属性,但这并不完全绝对,可以参照后续的动态篇会对这部分内容进行介绍。
object
所有类型的父类,C#所有类都是 object 的子类。不过上表中介绍的直接父类是 ValueType(表示值类型),但是 ValueType 的父类仍然是 object。
说明: 对于 double 和 float 因为存储数据方式的问题,都存在一个问题:对于 0 或者近 0 的值不能很好的表达。因为浮点型变量在内存中表示为 1/2n,所以都会存在一个+0 和-0 两个值。当 一个浮点型判断是不是等于 0 时,可以正常判断。但是一旦涉及到数学运算的结果与 0 进行比较的话就会出现问题,比如说 0.1+0.2 != 0.3
这个判断式是 true
。所以标准的判断方式应该是 Math.Abs(0.1+0.2 - 0.3)< ?
这种方式,其中?表示系统接受的误差范围。 而 decimal 在这方面的准确度就比 double 和 float 高很多。至少不会出现 0.1 + 0.2 != 0.3 这种问题。所以 decimal 一般用在金额计算这些地方。
类型转换是指一个类型的数值通过某种手段转换成另一种类型。类型转换分为两种方式:默认类型转换、强制类型转换。
默认类型转换在以下几种情况会触发默认类型转换:
- 当一个子类想转换成它的父类时,
- 当短精度向高精度转换时。如: byte -> int -> long -> float -> double参照:
int i = 1;double d = i;float f = i;d = f;uint ui = 1;long l = ui;d = l;f = l;
这里有几个需要特别注意的地方:
- 无符号和有符号之间的转换,如果无符号的位数与有符号之间的位数一致的话不能默认转换。
- decimal 所有的整型均可以默认转为
decimal
,即 除double
、float
以外所有数字类型的均可以。
is
:
C# 内置了一个关键字 用来 判断 某个变量是否是某个类型
class A{}class B : A{}class C : A{}class Program{ static void Main() { B b = new B(); A a = b; // 这时候 a 是一个 假装自己是 A 的 B 的引用 Console.WriteLine("a is B ? {0}", a is B); // 结果: true Console.WriteLine("a is A ? {0}", a is A); // true Console.WriteLine("a is C ? {0}", a is C); // false }}
那么is
有什么用呢?在强制类型转换之前检测一下是否可以转换为目标类型,如果返回值为 false 依旧要转换的话,那么就会报错。
强制类型转换分为两种:
- 在变量前加目标类型强制转换,这个方法与 C/C++、Java 的方式一致,具体为:
C c1 = (C)a;// 代码接上
- 使用
as
关键字,as
表示将变量 x 当做类型 Y
C c2 = a as C;// 代码接上
两种方式的区别:
当转型失败时会抛出错误,直接终止代码
当转型失败时将 c2 置为 null。当前步骤不会抛出异常,如果对于空引用没有进行处理,那么会在后续中抛出空引用的异常。
在之前的内容中我们提到了小精度到大精度可以默认转换。但是我们在平常使用的过程中会遇到各种情况下的转换,那么这个时候我们就要用到强制转换了,这个时候精度丢失对于我们来说就是可以接受的。
常见的转换方式有:
- 使用类型强制声明转换 例:
long lval = 100; int i = (int)lval;
- 使用 System.Convert 类。使用
Convert.ToXXX()
,其中XXX
表示转型目标对象。
//Convert 示例代码long lval = 19293;var i = Convert.ToInt32(lval);double d = 10.091;var dc = Convert.ToDecimal(d);var dt = Convert.ToDateTime("2019-03-30");
值得注意的是:Convert
的 ToXXX 其中 XXX 使用的是 C#类型名称,而不是关键字。Convert
是个很有用的类,在我们开发工作中会大量的使用这个类进行值的类型转换。
当然后续我们会对其进行更深入的介绍。
阅读全文: http://gitbook.cn/gitchat/activity/5e79b07fa617cb18a2299036
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。