首页 > 编程语言 >重学c#系列—— explicit、implicit与operator[三十四]

重学c#系列—— explicit、implicit与operator[三十四]

时间:2023-03-18 18:46:31浏览次数:32  
标签:string consumeValue c# explicit Value ConsumeValue static operator public

前言

我们都知道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 吧,这样不会报错。

用强制还是隐式一般看场景,一般情况下还是用隐式,写起来比较舒服一些。

该系列继续更新。

标签:string,consumeValue,c#,explicit,Value,ConsumeValue,static,operator,public
From: https://www.cnblogs.com/aoximin/p/17222930.html

相关文章

  • Mac工作环境初始化
    目录触摸板配置命令行配置常用软件日常办公文件编辑日常开发开发环境配置集成环境配置IDEA配置优化IDEA默认配置插件常用功能配置VSCode配置初始配置补充快捷键配置文件远......
  • mc 钟楼
    #include<iostream>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(intargc,char**argv){ boolcon=mc.ConnectMinecraft("zk.makeblock.......
  • c++钟楼
    #include<iostream>#include<string>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intx,y,z,id,data;voida(){ //正方形 mc.fillBlocks(x,y-1......
  • 浅谈 equals() 和 hashCode()
    equals()和hashCode()在Object类中定义hashCode():用于计算对象哈希值。equals():用于比较对象是否相等。默认实现Object定义的方法默认实现:均基于对象引用......
  • minecraft
    1#include<iostream>2#include"minecraft.h"3TxMinecraftmc;4usingnamespacestd;5intmain(intargc,char**argv){6boolcon=mc.ConnectMi......
  • vscode怎么开启代码提示
    1.点击设置---在搜索框里搜索“prevent”--将勾上的去掉  ......
  • sprintf和sscanf的使用
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structstu{intage;charname[1024];};intmain(){structstust={25,"LiMing"};structstust1={0}......
  • 在Eclipse中,当移动鼠标悬停到一些标签时标签名会暂时消失?
    刚开始使用eclipse软件学习Java时,发现它的工具栏的图标实在是太小了,怎么解决呢?你开始打开浏览器,在搜索栏中敲入“eclipse的工具栏的图标太小怎么办?”,你浏览了很多的方法,突......
  • 基于K8S搭建Ceph分部署存储
    基于K8S搭建Ceph分部署存储 2020年2月17日 技术、推荐博文唐玥璨7条留言版本依赖​    搭建思路很多高级运维人员都2020年了对于K8S的存储大部分都是采用主机......
  • T-Dubbo,最好的RPC接口测试工具,支持nacos、zookeeper两大主流注册中心,真香!
    这可能是有史以来最好用的RPC接口测试工具文末有视频简介获取方式一只小Coder简介T-Dubbo,是一个基于Dubbo的全自动RPC接口测试平台为当下最流行的微服务架构中的RPC......