C#自定义转换(implicit 或 explicit)
C#的类型转换分为显式转换和隐式转换,显式转换需要自己声明转换类型,而隐式转换由编译器自动完成,无需我们声明,如:
//long需要显式转换成int
long l = 1L;
int i = (int)l; //int可以隐式的转换成long
int i = 1;
long l =;
我们还可以自定义显式转换和隐式转换,分别采用 explicit 和 implicit 关键字来实现,格式:
//显式转换
public static explicit operator Type_A(Type_B b)
{
return Instance_Of_Type_A;
}
//隐式转换
public static implicit operator Type_A(Type_B b)
{
return Instance_Of_Type_A;
}
其中 Type_A 和 Type_B 是不同的类型,且必须有一个类型是当前包含这个转换的类型,如:
public class ClassA
{
public string Description { get; set; } public static implicit operator ClassA(ClassB classB) => new ClassA() { Description = "implicit from ClassB to ClassA:" + classB.Description };
public static implicit operator ClassA(string description) => new ClassA() { Description = "implicit from string to ClassA:" + description };
public static implicit operator ClassB(ClassA classA) => new ClassB() { Description = "implicit from ClassA to ClassB:" + classA.Description };
public static implicit operator string(ClassA classA) => "implicit from ClassA to string:" + classA.Description; public override string ToString() => Description;
}
public class ClassB
{
public string Description { get; set; } public static explicit operator ClassB(string description) => new ClassB() { Description = "explicit from string to ClassB:" + description };
public static explicit operator string(ClassB classB) => "explicit from ClassB to string:" + classB.Description; public override string ToString() => Description;
}
static void Main(string[] args)
{
//隐式转换
{
ClassA classA = "string";//字符串隐式转换成ClassA
Console.WriteLine(classA as object); string description = new ClassA() { Description = "ClassA" };//ClassA隐式转换成字符串
Console.WriteLine(description); ClassA classA1 = new ClassB() { Description = "ClassB" };//ClassB隐式转换成ClassA
Console.WriteLine(classA1 as object); ClassB classB = new ClassA() { Description = "ClassA" };//ClassA隐式转换成ClassB
Console.WriteLine(classB as object); //输出:
//implicit from string to ClassA:string
//implicit from ClassA to string:ClassA
//implicit from ClassB to ClassA:ClassB
//implicit from ClassA to ClassB:ClassA
} //显式转换
{
ClassB classB = (ClassB)"string";//字符串显式转换成ClassB
Console.WriteLine(classB as object); string description = (string)new ClassB() { Description = "ClassB" };//ClassB显式转换成字符串
Console.WriteLine(description); //输出:
//explicit from string to ClassB:string
//explicit from ClassB to string:ClassB
}
}
注:自定义的转换在开发中不常见,在一些第三方包、插件、框架中比较常见,但是有一个需要注意的点:is 和 as 运算不受自定义类型转换的影响,如:
static void Main(string[] args)
{
//值类型int可以隐式转换成long,==判断为true,但是is判断为false
int i = 1;//int
long l = i;//int可以隐式转换为long
Console.WriteLine(l == i);//true
Console.WriteLine(i is long);//false ClassA classA = new ClassA() { Description = "ClassA" };
ClassB classB = classA;//ClassA隐式转换成ClassB
Console.WriteLine(classB as object);//implicit from ClassA to ClassB:ClassA
Console.WriteLine(classA is ClassB);//false
}
C#自定义转换(implicit 或 explicit)的更多相关文章
- 显示转换explicit和隐式转换implicit
用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...
- C++雾中风景5:Explicit's better than implicit.聊聊Explicit.
关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议.那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊.而很多时候,Implicit的很多 ...
- 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
[源码下载] 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 作者:webabcd 介 ...
- 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
介绍背水一战 Windows 10 之 绑定 DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 UpdateSourceTr ...
- 【转】C#中的implicit 和 explicit
The implicit and explicit keywords in C# are used when declaring conversion operators. Let's say tha ...
- 5、flink常见函数使用及自定义转换函数
代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 一.flink编程方法 获取执行环境(execution environment) 加载/创建初始数据集 对 ...
- Spring自定义转换类,让@Value更方便
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章.对于@Val ...
- C# 自己定义 implicit和explicit转换
explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换explicti 表示显式转换.如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- C#之自己定义的implicit和explicit转换
在类型转换时常会遇到隐式转换和显式转换.那我们自己定义的类型要怎样去定义隐式转换和显式转换?我们来看一段代码 public class Rational { private Int32 _inner_ ...
随机推荐
- Swift3.0 延时执行
//延时1s执行 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(1*NSEC_PER_SEC))/ ...
- ligerUI 关闭父弹窗JS报错问题 解决方法
1:调用父窗口某一个文件框,获取焦点, parent.window.document.getElementById("roleName").focus(); 2:关闭父窗口pare ...
- Linux单机安装Zookeeper
一.官网 https://zookeeper.apache.org/ 二.简介 Apache ZooKeeper致力于开发和维护开源服务器,实现高度可靠的分布式协调. ZooKeeper是一种集中式服 ...
- ssh 无法使用
ssh 无法运行造成无法远程连接 linux 原因: 我将 /var 目录权限修改成了 777,但 linux 系统出于安全起见,该目录的 7 权限只对 root 用户开放,所以linux 系统认为 ...
- SpringSecurity Oauth2.0
1.用户认证分析 上面流程图描述了用户要操作的各个微服务,用户查看个人信息需要访问客户微服务,下单需要访问订单微服务,秒杀抢购商品需要访问秒杀微服务.每个服务都需要认证用户的身份,身份认证成功后,需要 ...
- 【Spark】【RDD】初次学习RDD 笔记 汇总
RDD Author:萌狼蓝天 [哔哩哔哩]萌狼蓝天 [博客]https://mllt.cc [博客园]萌狼蓝天 - 博客园 [微信公众号]mllt9920 [学习交流QQ群]238948804 目录 ...
- QPS和TPS的区别于理解
TPS: (每秒事务处理量(TransactionPerSecond)) 一个表达系统处理能力的性能指标,每秒处理的消息数(Transaction Per Second),每秒事务处理量 - 性能测试 ...
- Python连接MySQL数据库获取数据绘制柱状图
一.Python通过pymysql包获取MySQL数据库中的数据(没有对应包的可以通过pip install pymysql 安装对应的包) import matplotlib.pyplot as p ...
- Istio在Rainbond Service Mesh体系下的落地实践
两年前Service Mesh(服务网格)一出来就受到追捧,很多人认为它是微服务架构的最终形态,因为它可以让业务代码和微服务架构解耦,也就是说业务代码不需要修改就能实现微服务架构,但解耦还不够彻底,使 ...
- iterator 前++ 后++区别
for(iterator it = begin(); it != end(); ++it) 此处的 begin()<==>this->begin() 或者for(ite ...