C#中的这个几个关键字:explicit、implicit与operator,估计好多人的用不上,什么情况,这是什么?字面解释:explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。implicit:含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。operator:操作人员;技工;电话员;接线员;(某企业的)经营者,专业公司。说了这么多,其实explicit和implicit关键字分别表示显式的类型转换和隐式的类型转换。

volatile 关键字指示一个字段可以由多个同时执行的线程修改,可以保证值得最新。编译器在优化代码时,可能会把经常用到的代码存在Cache里面,然后下一次调用就直接读取Cache而不是内存,这样就大大提高了效率。但是问题也随之而来了,在多线程程序中,如果把一个变量放入Cache后,又有其他线程改变了变量的值,那么本线程是无法知道这个变化的。它可能会直接读Cache里的数据,但是很不幸,Cache里的数据已经过期了,读出来的是不合时宜的脏数据,这时就会出现bug。用volatile 声明变量可以很好的解决这个问题。

显式转换

显式转换(强制转换):必须使用强制运算符,才能执行的转换,在转换过程中可能会丢失信息或转换失败。
例如

public class BaseAB { }
public class A : BaseAB { }
public class B : BaseAB { }
//测试
double test = 1.234;
int testInt = (int)test;
Console.WriteLine(testInt); //运算结果1,强制转换数据丢失 try {
BaseAB ab = new A();
B b = (B)ab; //引用强制转换抛出异常 System.InvalidCastException: Unable to cast object of type 'A' to type 'B'.
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
}

在值类型强制转换的时候,会数据丢失,在引用类型做强制转换的时候会有引发InvalidCastException风险,但是可以通过使用模式匹配安全的进行强制转换,通过is和as运算符来检测是否属于特定类型。
模式匹配:给定一个子串,要求在某个字符串中找出与该子串相同的所有子串。例如:A是字串,BA是待查找的字符串,要求从BA中查找出所有与A相同的字串,这个问题就是模式匹配问题。A是模式,BA是目标。
例如:

var test = 1.1234;
int testInt = test is int ? (int)test : ;
Console.WriteLine(testInt);
BaseAB ab = new A();
B b = ab as B;
if (b == null) Console.WriteLine("ab 不是 B类型");
//结果:
//0
//ab 不是 B类型

隐式转换

隐式转换:这种转换是类型安全的,不需要特殊处理。
例如:

int i = ;
double b = i;
Console.WriteLine(b); A a = new A();
BaseAB baseAB = a;
//结果:
//

简单来说就是:小类型转换成大类型的时候隐式转换,大类型转换成小类型用强制转换。int > float > double >deca

正题

operator 关键字用于在类或结构声明中声明运算符。运算符声明可以采用下列四种形式之一:

public static result-type operator unary-operator (type1 param)
public static result-type operator binary-operator (type1 param1, type2 param)
public static implicit operator result-type (type param )
public static explicit operator result-type (type param )

参数说明:
result-type:结果类型
type,type1,type2:参数类型
unary-operator: + - ! ~ ++ — true false
binary-operator: + - * / % & | ^ << >> == != > < >= <=

介绍了这么多,开始步入正题,讲解explicit、implicit与operator。explicit、implicit都是与operator一起操作使用的,operator 关键字用于在类或结构声明中声明运算符。explicit用于强制转换,implicit用于隐式转换。
例如:

public struct MeDecimal
{
private readonly int intV;
private readonly double doubleV; public MeDecimal(int value):this(value,)
{
} public MeDecimal(double value):this(,value)
{
} public MeDecimal(int intV, double doubleV)
{
this.intV = intV;
this.doubleV = doubleV;
} public static implicit operator int(MeDecimal meDecimal)
{
return meDecimal.intV;
} public static explicit operator double(MeDecimal meDecimal)
{
return meDecimal.doubleV;
} public static implicit operator MeDecimal(int meDecimal)
{
return new MeDecimal(meDecimal);
} public static explicit operator MeDecimal(double meDecimal)
{
return new MeDecimal(meDecimal);
} public static MeDecimal operator ++(MeDecimal meDecimal)
{
var t = meDecimal.intV + ;
var t2 = meDecimal.doubleV + ;
var temp = new MeDecimal(t, t2);
return temp;
} public override string ToString()
{
return $"intV:{intV},doubleV:{doubleV}";
}
}

用法:

MeDecimal d = (MeDecimal)2.1;
Console.WriteLine($"原始数据:{d}");
d++;
double c = (double)d;
int c2 = d;
Console.WriteLine($"int的值:{c2},double的值:{c}");
Console.WriteLine($"{d}");

//结果:
原始数据:intV:0,doubleV:2.1
int的值:1,double的值:3.1
intV:1,doubleV:3.1

像一些类型需要转换的地方或者特殊处理的地方,可以用explicit、implicit,方便操作。

C#中转换运算符explicit、implicit、operator、volatile研究的更多相关文章

  1. 操作符(运算符)重载 或者叫 二元运算符 operator + 与 转换式操作符 implicit operator explicit operator

    static void Main(string[] args) { rational r1 = new rational(5); rational r2 = new rational(51); rat ...

  2. C# 转换运算符:implicit(隐式),explicit(显示)

    //A类 class Cls1 { public string name; //构造函数 public Cls1(string name) { this.name = name; } //implic ...

  3. C#类型转换运算符之 explicit implicit

    类型转换运算符 explicit和implicit用于声明用户定义的类型转换运算符,如果可以确保转换过程不会造成数据丢失,则可使用这两个关键字在用户定义的类型和其他类型之间进行转换. explicit ...

  4. C++中的隐式转换和explicit

    隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...

  5. C++标准转换运算符

    C++类型转换在实际编程中会经常使用,其实,本质上对象的类型用来解释(interpret)对象.因为,每个对象都占据一块内存空间,这块内存空间存放了一段二进制数据.通过标记该对象的类型,告诉如何看待这 ...

  6. C++标准转换运算符reinterpret_cast

    C++标准转换运算符reinterpret_cast reinterpret_cast <new_type> (expression) reinterpret_cast运算符是用来处理无关 ...

  7. C++标准转换运算符const_cast

    前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述.C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymor ...

  8. 【C++】C++中重载运算符和类型转换

    输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...

  9. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

随机推荐

  1. 小白的springboot之路(一)、环境搭建、第一个实例

    小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...

  2. 顺序栈与两栈共享空间-C语言实现

    栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码 #include <stdio.h> #define MAXSIZE ...

  3. 华为云ModelArts图深度学习,学习知识还能考取微认证

    作为人工智能最前沿的技术之一,图深度学习被公认是人工智能认识世界实现因果推理的关键,也是深度学习未来发展的方向.但深度学习对图数据模型的支持性差一直是众多研究者难以攻克的难点,因此图深度学习在实际生产 ...

  4. 一条数据的HBase之旅,简明HBase入门教程4:集群角色

    [摘要] 本文主要介绍HBase与HDFS的关系,一些关键进程角色,以及在部署上的建议 HBase与HDFS 我们都知道HBase的数据是存储于HDFS里面的,相信大家也都有这么的认知: HBase是 ...

  5. luogu P1754 球迷购票问题

    题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...

  6. cf1119d Frets On Fire 前缀和+二分

    题目:http://codeforces.com/problemset/problem/1119/D 题意:给一个数n,给出n个数组的第一个数(a[0]=m,a[1]=m+1,a[2]=m+2,... ...

  7. java中List、Map、Set、Stack、Queue、Collections等的使用

    java中List.Map.Set.Stack.Queue.Collections等的使用 List 创建方法: List<String> list=new ArrayList<&g ...

  8. 2019ICPC 上海网络赛 G题 Substring(哈希)

    题意: 给了一个母串S, 每次循环给了一个模板串,问模板串在母 串中“匹配”了多少次?“匹配”的意思就是首字母和尾字母一样, 中间字母顺序可以换. 题解: 字符串hash.我们将询问字符串的首尾特殊h ...

  9. 机器学习预测时label错位对未来数据做预测

    前言 这篇文章时承继上一篇机器学习经典模型使用归一化的影响.这次又有了新的任务,通过将label错位来对未来数据做预测. 实验过程 使用不同的归一化方法,不同得模型将测试集label错位,计算出MSE ...

  10. Typora常见的快捷方式

    操作类型 操作 快捷键 文件操作 新建 Ctrl + N    新建窗口 Ctrl + Shift + N    打开 Ctrl + O    快速打开 Ctrl + P    保存 Ctrl + S ...