前言

在 C# 中,数据类型可以分为以下几种类型:

  1. 值类型(Value types)
  2. 引用类型(Reference types)
  3. 指针类型(Pointer types)

其中指针类型只在不安全代码下使用,一般不涉及所以今天不讨论。我们主要探讨引用类型和值类型。

一、基本定义

值类型的变量在声明后,系统直接在托管栈中为其分配内存并保存其数据,其中值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct等,当我们声明一个引用类型时,系统并不会立刻在托管堆上分配空间,只有当我们使用new实例化后,系统才在托管堆上开辟一个内存空间保存其数据,并且将地址保存到托管栈中, 引用类型包括数组、类、接口、委托、数据等, 所以引用类型不包含存储在变量中的实际数据,而是保存实际数据的引用,如有多个引用变量操作时,只要有一个变量将值改变,其他变量会自动反映这种值的变化,比如我们申明了以下变量:

         static void Main(string[] args)
{
string name = "高俊涛";
int age = ;
string className = "高三七班";
Console.WriteLine($"姓名:{name}\n年龄:{age}\n班级:{className}");
Console.ReadLine();
}

那么按照上面的分析,由于age是值类型,name和className为引用类型,所以age直接在托管栈中保存变量和数据,而name和className则保存的是一个引用,这个引用指向托管堆,托管堆里面才保存相应的数据。

这两者既有联系又有区别,并且这两之间可以转化,就是我们说的“装箱”操作和“拆箱”操作,相同点和不同点总结如下:

二、相同点

  • 引用类型可以实现接口,值类型当中的结构体也可以实现接口;
  • 引用类型和值类型都继承自System.Object类,C#中的所有类型其实都继承System.Object,它是多有数据类型的基类。

三、不同点

虽然值类型和引用类型都继承自System.Object类。但几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类直接继承System.ValueType,
System.ValueType直接继承System.Object,但System.ValueType本身是一个类类型,而不是值类型;System.ValueType没有添加任何成员,但覆盖了所继承的一些方法,

使其更适合于值类型。此外需要特别注意的是string类型虽然为引用类型,但我们在平时操作时却发现它更像值类型,这是因为操作符重载的结果,但它仍为引用类型。

其数据类型的继承关系如下:

四、数据类型转化:

上面分析的c#的数据类型后,那么我们可能会想到这些类型之间的相互转换,我么数据类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。

在 C# 中,类型铸造有两种形式:

  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

下面介绍三种经常使用的显示类型转换:

4.1 值类型的强制转换

(数据类型)  变量名或值。这种类型的强制转换通常使用在值类型之间。比如在数据库设计的时候,用户表(user)有性别字段Sex(0代表男,1代表女),我们一般用bit或者int类型存储,界面上展示代表的值。这样的好处是:
可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示,那么我们在编程的时候就需要进行枚举类型的转换。需要注意的是

这种类型的数值转换,如果有小数点转int型的时候系统不会四舍五入,而是简单的舍弃。 转换代码如下:

         static void Main(string[] args)
{
//使用枚举定义变量
Gender gender = Gender.Male;
Console.WriteLine((int)gender);
Console.ReadLine();
}
/// <summary>
/// 枚举:1表示男 2表示女
/// </summary>
public enum Gender : int
{
Male = ,
Female =
}

4.2 强制类型转换Parse

这种类型的数值转换经常使用在字符串转数值型的情况下,需要注意的是,如果字符串必须是有效的数字形式,如果无效系统回给出异常信息,输入字符串的格式不正确。下面为字符串转数值和数值转字符串的代码:

         static void Main(string[] args)
{
//有效类型的字符串转成值类型
double myDouble = double.Parse("88.88");
float myFloat = float.Parse("88.66");
int myInt = int.Parse("");
//将值类型转成字符串类型
string myDoubleToStr = myDouble.ToString();
string myFloatToStr = myFloat.ToString();
string myIntToStr = myInt.ToString();
Console.WriteLine("myDoubleToStr={0},myFloatToStr={1},myIntToStr={2}", myDoubleToStr, myFloatToStr, myIntToStr);
Console.ReadLine();
}

4.3 万能转换器强制转换Convert

Convert为万能转换函数,可以实现任意数据类型之间的转换,使用起来没有上面两种条件苛刻,所以推荐大家使用。需要注意的是,在小数转整型的时候,如果有小数点,处理的规则跟第一种强制类型转换不同,

其处理规则为:

  1. 如果小数位小于5,则舍弃;
  2. 如果小数位等于5,看整数部分,奇进偶不进。比如88.5将转化为88,87.5还是转换为88;
  3. 如果小数位大于5,则进位
         /// <summary>
/// 演示Parse进行数据转换
/// GHB BY 2020-07-10
/// </summary>
public static void ParseData()
{ double myDouble = double.Parse("88.5");
float myFloat = float.Parse("87.5");
int myInt = int.Parse(""); int myDoubleToInt = Convert.ToInt32(myDouble);
int myFloatToInt = Convert.ToInt32(myFloat);
double myIntToDouble = Convert.ToDouble(myInt); Console.WriteLine( "myDouble={0}\nmyFloat={1}\nmyInt={2}\n" +
"myDoubleToInt ={3}\nmyFloatToInt={4}\nmyIntToDouble={5}\n",
myDouble, myFloat, myInt,
myDoubleToInt, myFloatToInt, myIntToDouble);
Console.ReadLine();
}

从运行结果可以看到,88.5和87.5转化为整型的时候,都是88。

五、总结

以上是本次分享的内容,我们首先分析了C#的数据类型,以及值类型和引用类型的区别,最后介绍了三种类型转换的函数,以及他们的区别和使用场景,主要是对小数点的出来规则。

水平有限,有些地方可能不一定正确,欢迎大家批评指正。

作者 高红斌
联系QQ 2358643757
出处 https://www.cnblogs.com/gaohongbin
本文版权归作者和博客园共有,如需全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。

C#数据类型及其转换详解的更多相关文章

  1. VC常用数据类型使用转换详解

    一.其它数据类型转换为字符串 短整型(int)itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制itoa(i,temp,2); ///按二进制方式转换 长整型 ...

  2. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  3. VC++常用数据类型及其操作详解

    原文地址:http://blog.csdn.net/ithomer/article/details/5019367 VC++常用数据类型及其操作详解 一.VC常用数据类型列表 二.常用数据类型转化 2 ...

  4. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  5. [五]基础数据类型之Short详解

      Short 基本数据类型short  的包装类 Short 类型的对象包含一个 short 类型的字段      原文地址:[五]基础数据类型之Short详解   属性简介   值为  215-1 ...

  6. CvMat、Mat、IplImage之间的转换详解及实例

    见原博客:http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数 ...

  7. python的dict()字典数据类型的方法详解以及案例使用

    一.之前的回顾 # int  数字 # str 字符串 # list 列表 # tuple 元组 # dict 字典 字典中最重要的方法 keys() values() items() get upd ...

  8. Python基本数据类型及实例详解

    Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对 ...

  9. JavaScript 对象、DOM对象、jquery对象的区别、转换详解

    一.JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 访问对象的属性: [javascrip ...

随机推荐

  1. char 型变量中能不能存贮一个中文汉字?为什么?

    在c语言中,char类型占一个字节,而汉字占两个字节,所以不能存储. 在java语言中,char类型占两个字节,而java默认采用Unicode码是16位,所以一个Unicode码占两个字节,java ...

  2. 迷宫城堡+算法讲解【tarjian算法】

    Tarjan 算法 参考博客:https://www.cnblogs.com/shadowland/p/5872257.html 算法讲解 Tarjan 算法一种由Robert Tarjan提出的求解 ...

  3. springboot整合Mybatis(有xml)

    pom.xml <!-- mybatis 支持 SpringBoot --> <dependency> <groupId>org.mybatis.spring.bo ...

  4. Elasticsearch去重查询/过滤重复数据(聚合)

    带家好,我是马儿,这次来讲一下最近遇到的一个问题 我司某个环境的es中被导入了重复数据,导致查询的时候会出现一些重复数据,所以要我们几个开发想一些解决方案,我们聊了聊,相出了下面一些方案: 1.从源头 ...

  5. 五个Taurus垃圾回收compactor优化方案,减少系统资源占用

    简介 TaurusDB是一种基于MySQL的计算与存储分离架构的云原生数据库,一个集群中包含多个存储几点,每个存储节点包含多块磁盘,每块磁盘对应一个或者多个slicestore的内存逻辑结构来管理. ...

  6. 机器学习中的标准化方法(Normalization Methods)

    希望这篇随笔能够从一个实用化的角度对ML中的标准化方法进行一个描述.即便是了解了标准化方法的意义,最终的最终还是要:拿来主义,能够在实践中使用. 动机:标准化的意义是什么? 我们为什么要标准化?想象我 ...

  7. LeetCode 题解目录

    前言 本目录将不断更新记录leetcode的刷题日记. 二叉树 序号 标题 难度 标签 1 108 将有序数组转换为二叉搜索树 简单 树.深度优先搜索 2 538 把二叉搜索树转换为累加树 简单 树 ...

  8. Java中在数字前自动补零方法

    /** * 数字前面自动补零 * @param number 数字 * @return */ public static String geFourNumber(int number){ Number ...

  9. TopK问题,数组中第K大(小)个元素问题总结

    问题描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 面试中常考的问题之一,同时这道题由于解法众多,也是考察时间复杂 ...

  10. InnoDB 中 B+ 树索引的分裂

    数据库中B+树索引的分裂并不总是从页的中间记录开始,这样可能会导致空间的浪费,例如下面的记录: 1, 2, 3, 4, 5, 6, 7, 8, 9 插入式根据自增顺序进行的,若这时插入10这条记录后需 ...