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

常见数据类型

C#的类型一般分为值类型引用类型两大类型。
值类型的实例存放在栈中,引用类型会在栈中放置一个指针指向堆中的某一块内容。
C#为我们内置了几个数据类型供我们使用:

关键词简写 对应的类全称(点击可以查看对应的API) 值范围 说明
bool System.Boolean true、false 该类型只有两个值,用作判断,表示“是”、“否”
sbyte System.SByte -128 ~ 127 (-27~27-1) 该类型在内存中使用8个bit进行存储,而且带有符号。
根据最高位作符号位,所以sbyte实际表示范围为 -128~127
byte System.Byte 0~28-1 8位的无符号bit
short System.Int16 -215~215-1 short表示一个16位的短整形,其具体的值为-32768~32767
ushort System.UInt16 0~216-1 ushort表示无符号16位的短整型,具体的范围为0~65535
int System.Int32 -215~215-1 int是我们常用的一个数据类型,它的数据范围为: -2,147,483,648~ 2,147,483,647 。
可以看到,是-2亿到2亿,基本满足了数据需要。
uint System.UInt32 0~232-1 uint 无符号整形,最大值比 int大一倍左右,但是没有负数。
如果在计算中能保证没有负值,可以使用。
并不推荐,因为在做减法的时候,更、容易溢出
long 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 0~264-1 64位无符号长整形,理同其他的无符号整形,在正整数中比long表达更多的数据。
char System.Char utf-16 在.net 中char 表示 utf-16的编码单位,所以绝大多数的字符都可以用char表示,包括中文汉字。
float System.Single -3.402823e38~3.402823e38 32位的单精度浮点型,也就是通常说的带小数点的数
double System.Double 64位双精度浮点型,比float能表示更多的小数位。
实际取值-1.79769313486232e308~1.79769313486232e308
decimal System.Decimal 128位高精度浮点值。
常用于不能四舍五入,或者对小数点后数字要求很敏感的地方。
在128位中,一位是符号位(表示正负),96位是值本身(N),8位是比例因子(k)。
所以decimal实际值应该是 ±Nx10k,其中-28≤k≤0.其余位暂时没有使用
string 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
    参照:

int i = 1;double d = i;float f = i;d = f;uint ui = 1;long l = ui;d = l;f = l;

这里有几个需要特别注意的地方:

  • 无符号和有符号之间的转换,如果无符号的位数与有符号之间的位数一致的话不能默认转换。

  • decimal 所有的整型均可以默认转为 decimal,即 除 doublefloat以外所有数字类型的均可以。

强制类型转换

数据类型判断 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 依旧要转换的话,那么就会报错。

强制类型转换

强制类型转换分为两种:

  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表示转型目标对象。

//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是个很有用的类,在我们开发工作中会大量的使用这个类进行值的类型转换。
当然后续我们会对其进行更深入的介绍。

(0)

相关推荐

  • (C语言中的“物种”)乐创DIY C语言讲义​——3.2节

    3.3 初识变量 C语言中的变量,其实都只不过是用户访问存储器的一种手段而已.C语言中变量的定义包含了两个层面的信息,其一是根据定义变量时的数据类型,分配给这个变量多少容量的内存单元(以一个字节为最小 ...

  • C#类型与变量

    8.28开始看刘铁猛的视频,到9.22看完.大概觉得自己入门了,对OOP也有一定了解了,稍微写点笔记,当复习了. 类型与变量 数据类型 数据类型[1]是数据在内存中存储时的"型号" ...

  • C语言数据类型转换(自动类型转换+强制类型转换)

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. ...

  • K线密码之裸K线入门基础知识系列教程(一)

    2019-06-26拾荒网 编辑:K线炮手 在股票市场如果不能坚持学习 那你是不可能有进步的,想进步就要不断学习股票各种技巧,其中k线的形态就能完美的体现出主力的意图 只要紧跟主力庄家我们才能收获多多 ...

  • K线密码之裸K线入门基础知识系列教程(二)

    K线密码之裸K线入门基础知识系列教程(二)

  • K线密码之裸K线入门基础知识系列教程(三)

    31.看涨吞没形态 应用法则: 1.看涨吞没形态出现在一轮明显的下跌趋势中,如果吞没形态具有下面列出了这样的一些参考性要素和特征,那么它们构成重要反转信号的可能性将大大地增强; 2.在看涨吞没形态中, ...

  • K线密码之裸K线入门基础知识系列教程(四)

    51.思量红三兵 应用法则: 1.虽然思量红三兵形态在一般情况下不属于顶部反转形态,但是有时候,它也能引出不容忽视的下跌行情.特别是若思量红三兵形态出现在一段上升行情的后期,当紧接着出现一个巨大的阴线 ...

  • 葡萄病害综合管理基础知识系列:来自链霉菌家族的农用抗生素

    在医学上,青霉素的发现与应用,可谓是人类健康史上的一次革命.但青霉素对结核杆菌的效果并不好.链霉素,发现于1943年10月19日,是美国罗格斯大学一名叫Albert Schatz 的博士生在著名微生物 ...

  • C# 基础知识系列-7 Linq详解

    前言 在上一篇中简单介绍了Linq的入门级用法,这一篇尝试讲解一些更加深入的使用方法,与前一篇的结构不一样的地方是,这一篇我会先介绍Linq里的支持方法,然后以实际需求为引导,分别以方法链的形式和类S ...

  • C# 基础知识系列- 8 Linq最后一部分查询表达式语法实践

    C# 基础知识系列- 8 Linq最后一部分查询表达式语法实践

  • C# 基础知识系列- 9 字符串的更多用法(一)

    0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...

  • C# 基础知识系列- 12 任务和多线程

    0. 前言 照例一份前言,在介绍任务和多线程之前,先介绍一下异步和同步的概念.我们之间介绍的知识点都是在同步执行,所谓的同步就是一行代码一行代码的执行,就像是我们日常乘坐地铁通过安检通道一样,想象我们 ...