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

前言

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

值类型(Value types)引用类型(Reference types)指针类型(Pointer types)

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

一、基本定义

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

 static void Main(string[] args)
  {
    string name = "高俊涛";
    int age = 20;
    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 = 0,
   Female = 1
  }

4.2 强制类型转换Parse

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

static void Main(string[] args)
  {
   //有效类型的字符串转成值类型
   double myDouble = double.Parse("88.88");
   float myFloat = float.Parse("88.66");
   int myInt = int.Parse("20");
   //将值类型转成字符串类型
   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为万能转换函数,可以实现任意数据类型之间的转换,使用起来没有上面两种条件苛刻,所以推荐大家使用。需要注意的是,在小数转整型的时候,如果有小数点,处理的规则跟第一种强制类型转换不同,

其处理规则为:

  • 如果小数位小于5,则舍弃;
  • 如果小数位等于5,看整数部分,奇进偶不进。比如88.5将转化为88,87.5还是转换为88;
  • 如果小数位大于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("20");

   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#的数据类型,以及值类型和引用类型的区别,最后介绍了三种类型转换的函数,以及他们的区别和使用场景,主要是对小数点的出来规则。

到此这篇关于C#数据类型及其转换详解的文章就介绍到这了,更多相关c# 数据类型转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#基础之数据类型转换

    int x; long y = 123456789101112; x = (int)y; Console.WriteLine(x); 输出结果: 我们知道long类型的取值范围是-9223372036854775805~+9223372036854775807:int类型的是:-2147483648~+2147483647 上面的代码中,由于long变量的值超过了int能容纳的最大值,造成了数据的丢失:像这样有可能造成数据丢失或引发异常的任何转换都需要执行显式转换(explicit); 相反的就

  • 详解C# 泛型中的数据类型判定与转换

    提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型: 1.常用的值类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float,double,decimal 孤独的枚举:enum 孤独的布尔:bool 2.常用的引用类型有: string,class,array,delegate,interface 值得注意的是,无论是值类型还是引用类型,在C#中都派生于object,没错,这家伙就是万恶之源! 正是因为有了这一特性,于是我

  • C# 数据类型转换

    目录 前言 相关介绍 一.函数方法 二.类型转换 [1]. 使用Convert转换 [2]. 使用类型名进行转换 总结 前言 在使用Console.Read()或Console.ReadLine()进行输入时,和Python语言的input()类似 两者都是把键盘键入的内容作为string类型返回,所以有些数据需要经过数据类型的转换才能进行计算. 相关介绍 C# System.Convert 类 微软官方C#函数文档 一.函数方法 下面罗列的函数方法不是全部,仅列举一些常用的 double这种有

  • c#之用户定义的数据类型转换介绍

    c# 允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在圆括号中写入目标数据类型. 对于预定义的数据类型,当数据类型转换时可能失败或丢失某些数据,需要显式转换, 1 把int数值转换成short时,因为short可能不够大,不能包含转换的数值. 2 把有符号的数据转换为无符号的数据,如果有符号的变量包含一个负值,会得到不正确的结果. 3 把浮点数转换为整数数据类型时,数字的小数部分会丢失. 此时应在代码中进行显式数据类型,告诉边起义你知道这会有丢失数据的危

  • 浅析C#数据类型转换的几种形式

    1.Convert.ToInt32(); //转换成32位的整数.2.变量.ToString();/最常见的转换成 字符串.3."订单"+2514 //后面的数字会转换为字符串.4.((类名A)对象名X) //强行将 对象X 转换成 A类 的对象.5.int.Parse(string);把字符串型转换成其他类型.6.还有,如果要转换成的类型为引用类型,还可以用 as teacher tea = teahcer();如 student stu = tea as student; (1)

  • C#数据类型转换(显式转型、隐式转型、强制转型)

    C# 的类型转换有显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问题的转换方式.由系统自动转换. 不同类型的数据进行操作(加减乘除赋值等等),是需要进行 类型转换 后,才能继续操作.所以需要“类型转换”. 隐式转型 隐式转型容易理解,当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换. 如 int i = 66666; long b = i; /

  • C#中把任意类型的泛型集合转换成SQLXML数据格式的实例

    话不多说,跟着小编一起来看下吧 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlTypes; using System.Data; using System.Reflection; using System.IO; using System.Xml; namespace CollectionToXml { class Program

  • C#中数据类型的转换介绍

    目录 1.parse转换:将string类型转化为其他类型 2.任意类型转化为string类型 3.隐式转换:自动转换-->小范围到大范围自动转换 4.显示转换:强制转换-->由大范围到小范围的强制转换,不过可能会发生精度丢失 5.最后再给一个简单的题目考考大家: 今天学习了一下数据类型的转换,我整理出了一下笔记: 1.parse转换:将string类型转化为其他类型 //数据类型的转换 //即string"18"==> int 18, //1.parse转换:将st

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

    前言 在C#中,数据类型可以分为以下几种类型: 值类型(Value types)引用类型(Reference types)指针类型(Pointer types) 其中指针类型只在不安全代码下使用,一般不涉及所以今天不讨论.我们主要探讨引用类型和值类型. 一.基本定义 值类型的变量在声明后,系统直接在托管栈中为其分配内存并保存其数据,其中值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct等,当我们声明一个引用类型时,系

  • java基础详解之数据类型知识点总结

    一.基本数据类型 1.1 整形 1.1.1 int int a = Integer.MAX_VALUE;//int最大值 int b = Integer.MIN_VALUE;//int最小值 在java中int占4个字节,和操作系统每任何关系.这也是java的可移植性. int 能表示的范围为-231~231-1,如果超出最大值或者小于最小值则会发生溢出. public static void main(String[] args) { int a = Integer.MAX_VALUE;//i

  • 详解Redis数据类型实现原理

    目录 1. 对象的类型与编码 ① type属性 ② encoding 属性和 *prt 指针 2. 字符串对象 ① 编码 ② 编码的转换 3. 列表对象 ① 编码 ② 编码转换 4. 哈希对象 ① 编码 ② 编码转换 5. 集合对象 ① 编码 ② 编码转换 6. 有序集合对象 ① 编码 ② 编码转换 7. 五大数据类型的应用场景 1. 对象的类型与编码 Redis使用前面说的五大数据类型来表示键和值,每次在Redis数据库中创建一个键值对时,至少会创建两个对象,一个是键对象,一个是值对象,而Re

  • 详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义

    同事问MySQL数据类型DECIMAL(N,M)中N和M分别表示什么含义,M不用说,显然是小数点后的小数位数,但这个N究竟是小数点之前的最大位数,还是加上小数部分后的最大位数?这个还真记不清了.于是乎,创建测试表验证了一番,结果如下: 测试表,seller_cost字段定义为decimal(14,2) CREATE TABLE `test_decimal` ( `id` int(11) NOT NULL, `seller_cost` decimal(14,2) DEFAULT NULL ) EN

  • 详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能! 格式转换主要原理就是先用java调用ffmpeg的exe文件

  • 详解XML,Object,Json转换与Xstream的使用

    详解XML,Object,Json转换与Xstream的使用 1.Xstream的特点: 这里直接引用Xstream官方的叙述: 灵活易用:在更高的层次上提供了简单.灵活.易用的统一接口,用户无需了解项目的底层细节 无需映射:大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作 高速稳定:设计时力求达到的最重要的指标是解析速度快.占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统 清晰易懂:项目采用reflection机制得到无冗余信息的XML文件.所生成 的XML文件

  • 详解如何用babel转换es6的class语法

    babel是一个转码器,目前开发react.vue项目都要使用到它.它可以把es6+的语法转换为es5,也可以转换JSX等语法. 我们在项目中都是通过配置插件和预设(多个插件的集合)来转换特定代码,例如env.stage-0等. 实际上babel可以通过自定义插件的方式实现任何代码的转换,接下来我们通过一个"把es6的 class 转换为es5"的例子来了解一下babel. 内容如下: webpack环境配置 大家应该都配置过babel-core这个loader,它的作用是提供babe

  • 详解Redis 数据类型

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value. string 类型是二进制安全的.意思是 redis 的 string 可以包含任何数据.比如jpg图片或者序列化的对象. string 类型是 Redis 最基本的数据类型,string 类

  • 详解JavaScript数据类型和判断方法

    前言 JavaScript 中目前有 7 种基本(原始primitives)数据类型 Undefined, Null,Boolean, Number, String,BigInt,Symbol,以及一种引用类型 Object,Object 中又包括 Function,Date,JSON,RegExp等,除了 7 种原始类型,其他的所有能够用 new 实例化的内置类型都是 Object 构造的. 数据类型 对于数据了类型我们可以通过 typeof 运算符来判断,具体结果看下图. 原始类型中两个比较

  • Java基础之详解基本数据类型的使用

    一.整型 主要扩展一下不同进制的整型 二进制.八进制.十进制.十六进制 * 二进制 : 0B(数字零+B) 0b(数字零+b) * 八进制 :0(数字零开头) * 十进制 :正常写就是十进制 * 十六进制 : 0X (数字零+X)0x (数字零+x) A-F 代表 10-15 1.1 测试代码 /** * 进制 : * 二进制 : 0B(数字零+B) 0b(数字零+b) * 八进制 :0(数字零开头) * 十进制 :正常写就是十进制 * 十六进制 : 0X (数字零+X)0x (数字零+x) *

随机推荐