C#数据类型及其转换详解

前言

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

  1. 值类型(Value types)

  2. 引用类型(Reference types)

  3. 指针类型(Pointer types)

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

一、基本定义

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

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

那么按照上面的分析,由于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型的时候系统不会四舍五入,而是简单的舍弃。 转换代码如下:

1         static void Main(string[] args) 2         { 3             //使用枚举定义变量 4             Gender gender = Gender.Male; 5             Console.WriteLine((int)gender); 6             Console.ReadLine(); 7         } 8         /// <summary> 9         /// 枚举:1表示男 2表示女10         /// </summary>11         public enum Gender : int12         {13             Male = 0,14             Female = 115         }

4.2 强制类型转换Parse

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

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

4.3 万能转换器强制转换Convert

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

其处理规则为:

  1. 如果小数位小于5,则舍弃;

  2. 如果小数位等于5,看整数部分,奇进偶不进。比如88.5将转化为88,87.5还是转换为88;

  3. 如果小数位大于5,则进位

1         /// <summary> 2         /// 演示Parse进行数据转换 3         /// GHB BY 2020-07-10 4         /// </summary> 5         public static void ParseData() 6         { 7  8             double myDouble = double.Parse("88.5"); 9             float myFloat = float.Parse("87.5");10             int myInt = int.Parse("20");11 12             int myDoubleToInt = Convert.ToInt32(myDouble);13             int myFloatToInt = Convert.ToInt32(myFloat);14             double myIntToDouble = Convert.ToDouble(myInt);15 16             Console.WriteLine( "myDouble={0}\nmyFloat={1}\nmyInt={2}\n" +17                                               "myDoubleToInt ={3}\nmyFloatToInt={4}\nmyIntToDouble={5}\n",18                                                myDouble, myFloat, myInt, 19                                                myDoubleToInt, myFloatToInt, myIntToDouble);20             Console.ReadLine();21         }

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

五、总结

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

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

(0)

相关推荐

  • 三、C#入门—数据类型

    C#数据类型 变量 声明->赋值->使用 作用域:变量作用域为包含它的大括号内 常量 1.const 数据类型 常量名称 = 常量值 声明常量时一定要赋值 2.@作用 输出转义字符 @&q ...

  • C#中Equals和= =(等于号)的比较)

    C#中Equals和= =(等于号)的比较) C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一.    ...

  • TS vs JS基础类型

    布尔值 ts:let isDone:boolean = false; js:var isDone = false; 数字 和JavaScript一样,TypeScript里的所有数字都是浮点数. 这些 ...

  • 学习 C# 从 Hello World 开始吧

    目录 一.一个简单的 C# 程序 二.标识符 三.关键字 四.Main:程序的起始点 五.空白 六.语句 七.从程序中输出文本 7.1 Write 7.2 WriteLine 7.3 格式字符串 7. ...

  • 近六年高考英语,5大类词性转换详解 核心词汇转换汇总!

    词性转换在高考英语中极其重要,特别是在语篇填空题,几乎每年都有1-3个空都是要对括号给出的单词进行词性的转换.分析句子结构并确定所填词在句子中所作的成分是解答词性转换题的关键所在.句子成分与词性的关系 ...

  • 【外语】近六年高考英语,5大类词性转换详解 核心词汇转换汇总!

    [高中外语]分析句子结构并确定所填词在句子中所作的成分是解答词性转换题的关键所在.句子成分与词性的关系成分词性主语名词.代词.数词.动词-ing形式.不定式.名词化的形容词.从句,相当于名词的短语谓语 ...

  • 编程语言基于javascript 显式转换与隐式转换(详解)_javascript技巧

    显示转换 1.题目:请输入今年的年龄,求5年后多大? //a.prompt接收到的数据是string类型的. var age = prompt("请输入你今年的年龄"); aler ...

  • css3之2D转换功能详解

    CSS3提供了2D转换功能,能够对元素进行移动.缩放和转动等功能. 2D转换的属性名为transform,使用方法为transform:method(value). 2D转换方法有translate. ...

  • python数据类型详解

    目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(') 用单引号括起来表示字符 ...

  • C/C++标准库之转换UTC时间到local本地时间详解

    前言 UTC 时间DateTime.UtcNow 和 系统本地时间 DateTime.Now 相差8个时区 ,美国本地时间和北京时间相差15个时区: 美国,而一般使用UTC时间方便统一各地区时间差异. ...

  • 照片储存与转换 | ACR详解06

    这是本系列的第6篇文章,讲解的是处理照片最后一个步骤,但是必须要先给大家讲解,处理好的照片并不是点一下按钮就直接保存了,这里面大有门道!"存储图像"就是把处理好的文件导出.这里不是 ...

  • 从零开始学Java(六)Java八种基本数据类型详解

    数据类型 1.数据类型有什么用? 数据类型用来声明变量,程序在运行过程中根据不同的数据类型分配不同大小的空间. int i = 10; double d = 1.23; i变量和d变量类型不同,空间大 ...

  • Win10统一更新平台UUP升级文件转换完整ESD/ISO镜像方法详解

    自Win10创意者更新发布后,微软讲逐步采用统一更新平台(unified update platform,简称UUP)取代老旧的Windows更新方式.有关UUP的详细介绍可参考微软官方博客<I ...