C# 基础知识系列- 1 数据类型

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C# 基础知识系列- 1 数据类型

月影西下   2020-03-23 我要评论
# 常见数据类型 C#的类型一般分为**值类型**、**引用类型**两大类型。 值类型的实例存放在栈中,引用类型会在栈中放置一个指针指向堆中的某一块内容。 C#为我们内置了几个数据类型供我们使用: |关键词简写|对应的类全称(点击可以查看对应的API)|值范围|说明| |:--:|:--|:--|:--| | bool|[`System.Boolean`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.Boolean)| true、false| `该类型只有两个值,用作判断,表示“是”、“否”` | | sbyte | [`System.SByte`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.SByte)| -128 ~ 127 (-27~27-1)| `该类型在内存中使用8个bit进行存储,而且带有符号。`
`根据最高位作符号位,所以sbyte实际表示范围为 -128~127` | | byte |[`System.Byte`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.byte)|0~28-1|`8位的无符号bit`| | short |[`System.Int16`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.Int16)|-215~215-1|`short表示一个16位的短整形,其具体的值为-32768~32767`| | ushort |[`System.UInt16`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.UInt16)|0~216-1|`ushort表示无符号16位的短整型,具体的范围为0~65535`| | int |[`System.Int32`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.Int32)|-215~215-1|`int是我们常用的一个数据类型,它的数据范围为: -2,147,483,648~ 2,147,483,647 。`
`可以看到,是-2亿到2亿,基本满足了数据需要。`| | uint |[`System.UInt32`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.UInt32 )|0~232-1|`uint 无符号整形,最大值比 int大一倍左右,但是没有负数。`
`如果在计算中能保证没有负值,可以使用。`
`并不推荐,因为在做减法的时候,更、容易溢出`| | long |[`System.Int64`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.Int64 )|-216~216-1|`实际取值为-9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 。`
`long在内存中比int占用更多字节,长度为int的两倍。`
`所以能表达更多的数剧。在数据库中,经常被用来做大数据表的主键。`| | ulong |[`System.UInt64`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.UInt64 )|0~264-1|`64位无符号长整形,理同其他的无符号整形,在正整数中比long表达更多的数据。`| | char |[`System.Char`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.char )|utf-16|`在.net 中char 表示 utf-16的编码单位,所以绝大多数的字符都可以用char表示,包括中文汉字。`| | float |[`System.Single`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.single )|-3.402823e38~3.402823e38|`32位的单精度浮点型,也就是通常说的带小数点的数`| | double |[`System.Double`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.double )||`64位双精度浮点型,比float能表示更多的小数位。`
`实际取值-1.79769313486232e308~1.79769313486232e308`| | decimal |[`System.Decimal`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.decimal )||`128位高精度浮点值。`
`常用于不能四舍五入,或者对小数点后数字要求很敏感的地方。`
`在128位中,一位是符号位(表示正负),96位是值本身(N),8位是比例因子(k)。`
`所以decimal实际值应该是` ±Nx10k`,其中-28≤k≤0.其余位暂时没有使用`| | string |[`System.String`](https:/https://img.qb5200.com/download-x/docs.microsoft.com/zh-cnhttps://img.qb5200.com/download-x/dotnet/api/system.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 参照: ```c# 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# 内置了一个关键字 用来 判断 某个变量是否是某个类型 ```csharp 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 依旧要转换的话,那么就会报错。 ### 强制类型转换 强制类型转换分为两种: 1. 在变量前加目标类型强制转换,这个方法与C/C++、Java的方式一致,具体为: ``` C c1 = (C)a;// 代码接上 ``` 2. 使用`as`关键字,`as` 表示将变量 x 当做类型Y ``` C c2 = a as C;// 代码接上 ``` 两种方式的区别: 1. 当转型失败时会抛出错误,直接终止代码 2. 当转型失败时将c2置为null。当前步骤不会抛出异常,如果对于空引用没有进行处理,那么会在***后续***中抛出空引用的异常。 ### 值类型的类型转换 在之前的内容中我们提到了小精度到大精度可以默认转换。但是我们在平常使用的过程中会遇到各种情况下的转换,那么这个时候我们就要用到强制转换了,这个时候精度丢失对于我们来说就是可以接受的。 常见的转换方式有: 1. 使用类型强制声明转换 例:` long lval = 100; int i = (int)lval;` 2. 使用 System.Convert类。使用 `Convert.ToXXX()`,其中`XXX`表示转型目标对象。 ```csharp //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`是个很有用的类,在我们开发工作中会大量的使用这个类进行值的类型转换。 当然后续我们会对其进行更深入的介绍。 >更多内容查看 [我的博客](https://blogs.attachie.club) 或 ![file](https://img2020.cnblogs.com/other/1266612/202003/1266612-20200323115614979-1130304055.jpg)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们