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,即 除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 当做类型YC 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是个很有用的类,在我们开发工作中会大量的使用这个类进行值的类型转换。
当然后续我们会对其进行更深入的介绍。
更多内容查看 我的博客 或
C# 基础知识系列- 1 数据类型的更多相关文章
- C# 基础知识系列-13 常见类库(三)
0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...
- 基础知识系列☞C#中→属性和字段的区别
"好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- C# 基础知识系列- 3 集合数组
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...
- C# 基础知识系列- 9 字符串的更多用法(一)
0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- C# 基础知识系列- 12 任务和多线程
0. 前言 照例一份前言,在介绍任务和多线程之前,先介绍一下异步和同步的概念.我们之间介绍的知识点都是在同步执行,所谓的同步就是一行代码一行代码的执行,就像是我们日常乘坐地铁通过安检通道一样,想象我们 ...
随机推荐
- python&&Java&&jsp+servlet连接数据库报错收藏(sql server,mysql)
写在最前面:sql server和mysql 是不同的东西... 我在完成java连接数据库的时候把这俩当成一个东西,结果下的mysql的jar包. 但自己的sql是server.. 然后尝试用 py ...
- Java程序、JSP以及JavaScript中如何判断某个字符串是否包含某个子串
1.JSP str:原始字符串, subStr:要查找的子字符串 <c:if test="${fn:contains(str,subStr)==true}"> < ...
- Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)
摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...
- spring参数拼装
-- 知道轮子是怎么造的 -- 自己试着造一造轮子 ,这样才可以更好地利用轮子,轮子的缺陷和优点才能明确. spring参数拼装,需要用到set函数,参考文档: http://coderec.cn/2 ...
- python基础之文件操作1
文件操作:os.mknod("test.txt") 创建空文件fp = open("test.txt",w) 直接打开一个文件,如果文件不 ...
- 基于SR-IOV的IO虚拟化技术
服务器配置要求 x86服务器内存不能低于32GB 服务器CPU需要支持虚拟化和设备虚拟化 VT-x VT-d,SR-IOV 功能,并且在BIOS中能启用了SR-IOV 网卡配置最起码为千兆配置 支持 ...
- concurrent包分析之Executor框架
文章目录 线程生命周期的开销:线程比较少的情况使用new Thread(task)无多大影响,但是如果涉及到线程比较多的情况,应用的性能就会受到影响,如果jdbc创建连接一样,new Thead创建线 ...
- Random Forest And Extra Trees
随机森林 我们对使用决策树随机取样的集成学习有个形象的名字–随机森林. scikit-learn 中封装的随机森林,在决策树的节点划分上,在随机的特征子集上寻找最优划分特征. import numpy ...
- 1,Hadoop知识储备
Hadoop初学思维导图 1,Hadoop ··· Hadoop: Hadoop的核心由HDFS和MapReduce组成.HDFS是分布式文件系统,是Hadoop生态圈的分布式数据存储基石:M ...
- 一道二叉树题的n步优化——LeetCode98validate binary search tree(草稿)
树的题目,往往可以用到三种遍历.以及递归,因为其结构上天然地可以往深处递归,且判断条件也往往不复杂(左右子树都是空的). LeetCode 98题讲的是,判断一棵树是不是二叉搜索树. 题目中给的是标准 ...
