当前位置: 首页 > news >正文

【C#】通用类型转换

【C#】通用类型转换

  • 自动类型转换(隐式类型转换)
  • 强制类型转换(显式类型转换)
  • 通过函数进行转换(通过方法进行类型转换)
  • 使用 as 操作符转换
  • 通用类型转换方法实现

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

自动类型转换(隐式类型转换)

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

例如:

int i = 100;
double d = i; 

敲黑板:

  1. 转换前后的类型必须相兼容 例如:int和double
  2. 隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换,即小的类型转大的类型

强制类型转换(显式类型转换)

与自动转换正好相反,强制转换需要用户明确地指定转换的类型。显式转换包括所有的隐式转换,也就是说把任何系统允许的隐式转换写成显式转换的形式都是允许的
例如:

double d = 100.00;
int i = (int)d;

敲黑板:

  1. 显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型。无法进行类型转换。
  2. 强制类型转换会造成数据精度丢失。

通过函数进行转换(通过方法进行类型转换)

函数转换,顾名思义通过编写类型处理方法的形式达到转换类型的目的。

int i;
string str = "100";
i = int.Parse(str);
int.TryParse(str, out i); // 推荐使用,对比 int.Parse(str) 多了异常处理增强了代码的健壮性
  • 常用类型转换方法
方法说明
ToStringC# 基类型是 Object 所以所有的类型都有 ToString()。转字符串类型
Convert.ToChar转换为字符型(char)
Convert.ToString转换为字符串型(string)
Convert.ToDateTime转换为日期型(datetime)
Convert.ToDouble转换为双精度浮点型(double)
Conert.ToSingle转换为单精度浮点型(float)
Convert.ToBase64CharArray将数组中的项进行 Base64 编码
Convert.ToBase64String将字符串进行 Base64 编码
Convert.ToBoolean转换为布尔类型(bool)
Convert.ToDecimal转换为等效的十进制数
Convert.ToSByte转换为 8 位带符号整数
Convert.ToInt32转换为 32 位带符号整数
Convert.ToInt16转换为 16 位带符号整数
Convert.ToInt64转换为 64 位带符号整数
Convert.ToByte转换为 8 位无符号整数
Convert.ToUInt16转换为 16 位无符号整数
Convert.ToUInt32转换为 32 位无符号整数
Convert.ToUInt64转换为 64 位无符号整数

使用 as 操作符转换

使用 as 操作符具有 高效安全 的特点:
  as 操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象当不成功的时候,会返回 null
  当用 as 操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要手动加上try-catch,所以相对来说,as 效率高。

敲黑板:

  1. as 转换不成功会返回 null 因此在无法确定转换结果的情况下一定一定要进行判空。
  2. as 也有一定的限制:
    • 不用在类型之间进行类型转化
    • 不能应用在值类型数据 - 只支持引用类型

通用类型转换方法实现

通用类型转换方法本质还是方法进行类型转换的方式,确切来说是 Convert 的形式。
不同于现有的转换方法有固定的类型,通用型是通过 泛型 约束来定义目标转换类型。并且使用扩展方法的形式是的调用起来非常的容易,且可以进行链式编程。

public static class Extensions
{public static T Parse<T>(this object value, T defaultValue = default){var type = typeof(T);try{var nullableType = Nullable.GetUnderlyingType(type);if (nullableType is null)return (T)Convert.ChangeType(value, type);return (T)Convert.ChangeType(value, nullableType);}catch{return defaultValue;}}
}

备注

  • 还可以通过继承接口 IConventible 或者 TypeConventer 类,从而实现自己的转换。
http://www.lryc.cn/news/134687.html

相关文章:

  • 传统DNS、负载均衡服务发现框架与专业服务发现框架(Eurek、nacos)分析
  • js中数组常用操作函数
  • Windows、Mac、Linux端口占用解决
  • 企业文件透明加密软件——「天锐绿盾」数据防泄密管理软件系统
  • Postman接口自动化测试实例
  • 软件团队降本增效-构建人员评价体系
  • Python实现SSA智能麻雀搜索算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
  • web JS高德地图标点、点聚合、自定义图标、自定义窗体信息、换肤等功能实现和高复用性组件封装教程
  • AlpacaFarm: A Simulation Framework for Methods that Learn from Human Feedback
  • 【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)
  • 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 5- 完成 Spring 容器对象的自动装配 -@Autowried
  • linux的http服务
  • Restful架构简单了解
  • conda常用命令
  • Linux:shell脚本:基础使用(6)《正则表达式-awk工具》
  • 国际阿里云腾讯云:阿里云服务器怎么打包
  • FPGA中锁存器(latch)、触发器(flip-flop)以及寄存器(register)详解
  • 【正点原子STM32连载】第十八章 通用定时器PWM输出实验 摘自【正点原子】APM32F407最小系统板使用指南
  • 分类预测 | MATLAB实现BWO-TCN-Attention数据分类预测
  • 6.链路追踪-Zipkin
  • 基于ACF,AMDF算法的语音编码matlab仿真
  • python 基础篇 day 1 初识变量和数据类型
  • Window下部署使用Stable Diffusion AI开源项目绘图
  • 【MySQL】好好学习一下InnoDB中的页
  • git开发常用命令
  • WEB APIs day5
  • html动态爱心代码【一】(附源码)
  • 【仿写tomcat】六、解析xml文件配置端口、线程池核心参数
  • Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果
  • (1)、扩展SpringCache一站式解决缓存击穿,穿透,雪崩