重学c#系列—— explicit、implicit与operator[三十四]
前言
我们都知道operator 可以对我们的操作符进行重写,那么explicit 和 implicit 就是对转换的重写。
正文
explicit 就是强制转换,然后implicit 就是隐式转换。
static void Main(string[] args)
{
string a = string.Empty;
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value = "测试数据";
a = consumeValue;
Console.WriteLine(a);
}
public struct ConsumeValue
{
public string Value;
public static implicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
}
}
比如说,自己定义了一个结构体,然后让结构体可以和string之间相互转换。

那么你也可以写 string 转换为 ConsumeValue的。
static void Main(string[] args)
{
string a = "测试数据";
ConsumeValue consumeValue = a;
Console.WriteLine(consumeValue.Value);
}
public struct ConsumeValue
{
public string Value;
public static implicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
}
public static implicit operator ConsumeValue(string value)
{
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value=value;
return consumeValue;
}
}
出了隐式转换,还可以强制转换。
static void Main(string[] args)
{
string a = "测试数据";
ConsumeValue consumeValue = (ConsumeValue)a;
Console.WriteLine(consumeValue.Value);
}
public struct ConsumeValue
{
public string Value;
//public static implicit operator String(ConsumeValue consumeValue)
//{
// return consumeValue.Value;
//}
//public static implicit operator ConsumeValue(string value)
//{
// ConsumeValue consumeValue = new ConsumeValue();
// consumeValue.Value=value;
// return consumeValue;
//}
public static explicit operator String(ConsumeValue consumeValue)
{
return consumeValue.Value;
}
public static explicit operator ConsumeValue(string value)
{
ConsumeValue consumeValue = new ConsumeValue();
consumeValue.Value = value;
return consumeValue;
}
}
强制转换就是需要在前面加上要转换的类型。
那么来看下这两者的原理。
隐式转换原理。

其实就是生成两个静态的方法。
然后调用。

所以隐式转换是安全的,就是我们调用方法一样。
那么看下强制转换的原理。

也是一样的。
这样我们就会存在一个疑问哈,那就是既然有隐式转换,自动帮我们验证,那么强制转换不是麻烦吗?
是的一般情况下,我们不用强制转换的,但是它有用武之地。
那就是传进来是一个object的时候。
static void Main(string[] args)
{
object a = new ConsumeValue();
ConsumeValue consumeValue = (ConsumeValue)a;
Console.WriteLine(consumeValue.Value);
}
你不知道其类型的时候,比如有马 和 羊,还有车,他们没有继承关系的时候,你希望给他们进行代理抽象,那么你传进来的可能就是一个object,那么这个时候自然就是强制转换了。
写个伪代码
chouxiang:
name
// 强制转换的方法 yang ma che
yang:
name
ma:
name
che:
name
方法:
string change(object a):
var c = (chouxiang)a
现在还是尽量用is 和 as 吧,这样不会报错。
用强制还是隐式一般看场景,一般情况下还是用隐式,写起来比较舒服一些。
结
该系列继续更新。
重学c#系列—— explicit、implicit与operator[三十四]的更多相关文章
- 重学c#系列——逆变和协变[二十四]
前言 简单整理一下逆变和协变. 正文 什么是逆变和协变呢? 首先逆变和协变都是术语. 协变表示能够使用比原始指定的派生类型的派生程度更大的类型. 逆变表示能够使用比原始指定的派生类型的派生程度更小的类 ...
- 重学c#系列——委托和匿名函数[二十五]
前言 简单介绍一下什么是委托. 正文 以前也写过委托,这次算是重新归档,和新的补充吧. https://www.cnblogs.com/aoximin/p/13940125.html 有些人说委托是函 ...
- 重学c#系列——订阅发布与事件[二十六]
前言 简单介绍一下订阅发布与事件. 正文 先来看一下委托的订阅与发布. public delegate void TestDelegate(); public class Cat { public T ...
- 重学c#系列—— 反射的基本理解[三十三]
前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...
- 重学c#系列—— 反射深入一点点[三十三]
前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...
- 重学c#系列——字典(十一)
前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...
- 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...
- 重学c#系列——对c#粗浅的认识(一)
前言 什么是c#呢? 首先你是如何读c#的呢?c sharp?或者c 井? 官方读法是:see sharp. 有没有发现开发多年,然后感觉名字不对. tip:为个人重新整理,如学习还是看官网,c# 文 ...
- 重学c#系列——linq(2) [二十八]
前言 前文提及到了一些基础的linq的基础,那么这一节是一些补充. 正文 关于一个orderby的问题. 比如我们输入两个order by. 这里告诉我们多个order by是没有意义的,如果多个那么 ...
- 重学Golang系列(一): 深入理解 interface和reflect
前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...
随机推荐
- 计蒜客(Stone Game)01背包
题意:在集合中挑一些数,形成一个集合S,剩下的数形成另一个集合P,使得S>= P ,并且对于S中任意元素ai,S-ai<=P 问有多少种方案. 题目链接:https://nanti.jis ...
- Linux常用指令1
1.文件和目录的相关指令: ·cd:打开 ·pwd:查看当前所在的目录 ·mkdir:新建目录 ·rmdir:删除目录 ·ls:文件和目录查看 ·cp:复制 ·rm:删除 ·mv:移动 2.文本文件内 ...
- 新手:git回滚代码,合并代码解决冲突
回滚到某个tag: git reset --hard 70438034dc git push -f 合并---解决冲突---提交: Step 1. Fetch and check out the br ...
- 【JavaScript】JS写法随笔(一) Ajax写法
$("#btn").click(function () { var wanted_code = $("#wanted_code").children('opti ...
- 【逆向】CVE-2017-8570漏洞分析调试技巧
前言 CVE-2017-8570是一个逻辑型漏洞,该漏洞利用复合Moniker绕过了CVE-2017-0199的更新补丁,可以在Office文档中执行任意SCT(Windows Script Comp ...
- C#——》发布ASP.NET Core项目到Windows IIS服务器中环境部署
服务器:Windows Server2012 R2 IIS:8 .net Core版本:1.1.2 一,在VS中点击项目-->依赖项-->SDK下可以查看当前项目.Net core是哪个版 ...
- deepin系统编辑pdf文件的两个简单方法(终端命令行模式)
DEEPIN深度系统编辑PDF文件有时竟然超级简单好用,比WINDOWS系统需要单独下载一个PDF编辑软件的方法强多了,而且windows系统PDF编辑软件还有版权限制,各种作啊. 下面的两条命令,使 ...
- Element UI 父组件el-tabel选择某行跳转子组件,在子组件的el-table中选择数组,添加到父组件操作行中
解决思路: 1.在父组件选择操作某行数据时,将父组件的行号暂存(index). 2.跳转子组件页面,选择某行数据,点击提交将该行数据传递个父组件 3.父组件取到第一步暂存行号(index),将子组件传 ...
- UCID数据集
UCID数据集,做实验使用, 免费分享. 自取 链接:https://pan.baidu.com/s/1etMgXShdd_tJFHWbP3ipNw 提取码:62ww
- k8s利用endpoints和service访问外部服务
一.原理解析 在k8s集群中我们通过创建service去访问对应pod内的服务,而在创建service的时候会同时创建一个与service同名的endpoints对象,endpoints与pod实际建 ...