C# 数据类型转换 显式转型、隐式转型、强制转型
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 = ;
- 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 = ;
- int y = ;
- 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 = ;
- 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 = ;
- int y = ;
- int e = x / y;
- }
- catch (Exception ex)
- {
- ee = ex.ToString();
- Console.WriteLine($"{ee}");
- }
- Console.ReadKey();
- }
- }
C# 数据类型转换 显式转型、隐式转型、强制转型的更多相关文章
- dll的加载方式主要分为两大类,显式和隐式链接
之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...
- 显式与隐式(ExplicitAndImplicit)
显式与隐式(Explicit And Implicit) 1.概念 1.1 显式 实现的单词Explicit意思是清楚的.明确的.详述的.所以,显式的“显”是指明显且清楚的实现,相对于接口来说,就是明 ...
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
[论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...
- C++ 不具有继承关系的类之间的显式,隐式转换 2013-07-11 15:41
好久没有写blog了,今天在学习c#的时候看到某一章节 讲类的隐式与显式转换.特此留笔,以供后续参考之用. 关于显式,隐式转换有些争论,说什么不建议隐式转换.但是个人认为非必要,如果有良好的基础书写基 ...
- 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)
作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- JavaScript 数据类型转换(显式与隐式)
一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...
- (转载)Android理解:显式和隐式Intent
Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种 ...
- 【转】Android理解:显式和隐式Intent---- try catch
原文网址:http://blog.csdn.net/xiao__gui/article/details/11392987 Intent是Android初学者比较难理解的一个东西.我这里以通俗易懂的语言 ...
随机推荐
- 很乱,临时保存,自定义v-model
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 开始使用 Vuejs 2.0 ---简单总结2
Vuejs的常用指令 v-html v-show v-if v-for v-on 1 .v-html v-html 更新元素或者变量的innerHTML,按普通html解析,和v-text的区别是在变 ...
- JavaScript自增、自减
JavaScript自增.自减运算符与表达式语法 var i++; var-- 声明变量 i-- 变量名 ++ -- 自增运算符 JavaScript自增.自减运算符与表达式 JavaScript自增 ...
- Android四大组件--服务(Service)
1. startService和bindService的区别 1. startService: 生命周期: onCreate---onStartCommand---onDestory 与服务的通讯: ...
- 利用jquery的ajax实现跨域,内部其实是jsonp协议了,不是XHRhttp协议
一.同源策略 要理解跨域,先要了解一下“同源策略”.所谓同源是指,域名,协议,端口相同.所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西. 一些常见的是否同源示例可参照下表: 在 ...
- 深度为君剖析CTO、技术总监、首席架构师的区别
CTO.技术总监.首席架构师的区别 经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个 ...
- 九: 操作提示(js版本)
一.toast 消息提示框 他用到了一个wx.showToast(object) 这样一个方法.作用是显示提示框. /* ---page/test/test.wxml----*/ <butt ...
- lodop打印多页
定义全局变量 var loop = null; 加载时候打印 window.On_CLodop_Opened = function () { print(); //OpenPreview()是调用打印 ...
- Linq学习以及简单用法
Linq学习 Linq(language Intergrated Query)即语言集成查询 LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询.用于保存和检索来自不同数据源的数据, ...
- protobuf简单测试应用
protobuf是google推出的一种数据交换协议,比较适合应用于底层服务交互,nodejs提供protobufjs包的实现,下面是一个简单的测试demo: 首先是.proto文件: package ...