C#数据类型转换(显式转型、隐式转型、强制转型)
作者:痴者工良 发布时间:2021-11-24 13:44:25
C# 的类型转换有显式转型 和 隐式转型 两种方式。
显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。
隐式转型:不会改变原有数据精确度、引发异常,不会发生任何问题的转换方式。由系统自动转换。
不同类型的数据进行操作(加减乘除赋值等等),是需要进行 类型转换 后,才能继续操作。所以需要“类型转换”。
隐式转型
隐式转型容易理解,当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换。
如
int i = 66666;
long b = i;//转为 long 类型后为 b 赋值
通常情况下,多种 值类型 进行计算时,系统会自动进行隐式转型,并且总是转为范围更大的数据类型,并且不会发生精确度变化、数字大小变化等等。
显式转型
问题是,但你需要把一个 long 类型的数据转成 int 时,又或者让 string 与 int 互转,当数据小数点太多时,这时候就必须使用显式转型。
在继续下列教程前,要想说明一点。
char 是整型!
虽然char存储的是字符而不是数字,但它的确是整型,翻回上面看一下图,可以发现。
也就是说,char是可以参与算术运算的。但并不是直接参与,而是char的基础值。c# 中的char值是基于Unicode的。通过Unicode,任意字符都可以解释成数字。
一,使用 ([type]) 转型操作符
此方法适用与值类型转换( string属于引用类型)
在需要转换的变量前加上( [类型] )即可
请仔细观察下面两图的差异
第二张图中的代码中,第二行,为 int b = (int)i;
在需要转换的变量前使用 ([type]) 这种格式进行转换,如(int)、(float)、(long)
注意,
此种方法只能对值类型数据进行转换。
不应将范围大的类型 往 小 转换 或 将浮点型转为整形,不能将超范围的往小了转。
例如 float 转为 int,精确度会被自动丢失
输出 666
将大于其类型范围的数给它时,会发生溢出。
char 可以直接跟 int 或 long 使用。
int a ='1' + '3'; //小转大
char b = (char)a; //大转小
int c = 'a' + '5';//char可以直接转为 int
注意上下例子的不同 ,int 直接转为char,会报错
第二,[Type].Parse()
([type]) 方法是无法在值类型、引用类型( string 类型)间转换的。
但每种数据类型都提供一个Parse()方法,它允许把字符串转成对应的 数值类型。
int.Parse()
float.Parse()
请看例子
string str = "666";
long i = int.Parse(str);
Console.WriteLine($"{i},{i.GetType()}");
Console.ReadKey();
(图如)
注意,
Parse() 是专为 string 类型转成 值类型 提供功能的!
Parse() 是为符合数字格式的 string 类型进行转换!
下面的例子都是错误用法 !
Parse() 是将符合数字格式的字符串转为数字,也就是说,
( )括号内的必须为字符串 !
字符串的内容必须为数字 !
例子 1 ( ) 括号内的内容不是字符串
例子 2 变量 str 的内容不是 有效数字格式
第三,[Type].TryParse()
格式如下
int.TryParse()
float.TryParse()
.TryParse()与.Parse()相似,但是使用形式不太一样,
[类型].TryParse(要更改的字符串,out 存储到哪个变量);
最重要的不同点在于,.TryParse() 在转换失败时,不会引发异常,而是返回 flase
例子
string str = "666";
int i;
bool b = int.TryParse(str,out i);//接收转换结果
或者
string str = "666";
int i;
int.TryParse(str,out i);//不接收转换结果
如果你不知道 out 的使用,请查阅C#中的out参数/ref参数/params可变参数
第四,System.Convert
方法例子
System.Convert.ToSingle();
System.Convert.ToInt32();
System.Convert.ToDouble();
System.Convert 允许将一种类型转为另一种类型。
常见 类型列表: char、sbyte、short、int、long、uint、ulong、float、double、decimal、string、bool ... ...
但是,同样需要格式支持!
string str = "666";
int a= System.Convert.ToInt32(str); //正确
string str = "666.66";
int a= System.Convert.ToInt32(str); //报错
int a = 66666;
bool c = System.Convert.ToBoolean(a); //正确
string str = "666.66";
bool c = System.Convert.ToBoolean(str); //报错
System.Convert 在转换是也需要注意 格式 才能转换成功。
同样,此方式也会发生精确度、数字大小改变
第五,System.Convert
.Tostring()
每种数据类型都提供了转为字符串类型的方法 ToString()
无论是值类型还是DateTime 等各种引用类型。
ToString()使用方法最为简单,请留意下列例子的红色背景部分
using System;
using System.IO;
public class Test
{
static void Main()
{
int a = 666;
string aa = a.ToString();
Console.WriteLine($"{aa}");
float b = 666.666F;
string bb = b.ToString();
Console.WriteLine($"{bb}");
DateTime c = DateTime.Now;
string cc = c.ToString();
Console.WriteLine($"{cc}");
FileInfo d = new FileInfo("E:\\test.txt");
string dd = d.ToString();
Console.WriteLine($"{dd}");
string ee;
try
{
int x = 1;
int y = 0;
int e = x / y;
}
catch (Exception ex)
{
ee = ex.ToString();
Console.WriteLine($"{ee}");
}
Console.ReadKey();
}
}
看到了吧?无论什么类型,只需在后面加上 ToString() , 都能 输出 string 类型的内容。(不是转为 string 类型!)
当然,ToString() 是一个方法,并提供了 一下传入参数,每种类型都有几个重载的 TOString() 方法,例如DateTime的
public string ToString(string format, IFormatProvider provider);
public string ToString(string format);
public string ToString(IFormatProvider provider);
public override string ToString();
其它方面不再赘述。
复制下列代码到控制台,看看输出了什么
using System;
using System.IO;
public class Test
{
static void Main()
{
int a = 666;
string aa = a.ToString();
Console.WriteLine($"{aa}");
float b = 666.666F;
string bb = b.ToString();
Console.WriteLine($"{bb}");
DateTime c = DateTime.Now;
string cc = c.ToString();
Console.WriteLine($"{cc}");
FileInfo d = new FileInfo("E:\\test.txt");
string dd = d.ToString();
Console.WriteLine($"{dd}");
string ee;
try
{
int x = 1;
int y = 0;
int e = x / y;
}
catch (Exception ex)
{
ee = ex.ToString();
Console.WriteLine($"{ee}");
}
Console.ReadKey();
}
}
来源:https://www.cnblogs.com/whuanle/p/9938918.html


猜你喜欢
- 本文实例讲述了C#实现两个时间相减的方法。分享给大家供大家参考。具体实现方法如下:using System; using Sys
- 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来
- 本文实例为大家分享了Android刷新加载框架的具体代码,供大家参考,具体内容如下1.定义一个接口控制下拉和上拉public interfa
- 简述: 前端时间再看一些类库的源码,发现责任链模式的强大之处,尤其是和建造者模式的结合后强大的动态可扩展
- AsyncTask不仅方便我们在子线程中对UI进行更新操作,还可以借助其本身的线程池来实现多线程任务。下面是一个使用AsyncTask来实现
- Sentinel 是什么?随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系
- 为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 Output
- 前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本
- 需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的I
- springboot @ConfigurationProperties和@PropertySource区别@ConfigurationPro
- 前言Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候
- Springboot启动不检查JPA的数据源配置1.问题有时我们使用spring boot ,在依赖中配置了spring data jpa的
- 本文实例为大家分享了Android开发之ViewPager实现滑动切换页面的具体代码,供大家参考,具体内容如下基本构件activity_ma
- 这篇文章说明了如何通过Maven配置Spring依赖项。最新的Spring版本可以在Maven Central上找到。Maven中的Spri
- 下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示:class HeaderBar @JvmOverload
- 本文实例分析了java中成员变量与局部变量区别。分享给大家供大家参考。具体分析如下:成员变量:在这个类里定义的私有变量,属于这个类。创建以及
- 不少朋友自己下载了一个Android SDK,怎样在Android studio中默认的Android SDK路径呢?打开Android s
- SqlSessionFactory的openSession方法正如其名,Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,
- System类的常用用法1,主要获取系统的环境变量信息public static void sysProp()throws Exceptio
- 工程搭建1.File->new->project;2.选择“Spring Initializr”,点击next;(jdk1.8默