类型转换关键字explicit与implicit的用法

这篇是个语法文,虽然这两个关键字比较陌生,但让自己有个印象不是坏事

explicit 明确转换与 implicit 隐含转换都是c#内的关键字,目的是让一个类型

转换到另外一个类型,最常见的例子就是由double转换到int时要使用明确转换,

而int转换到double的时候是使用隐含转换。


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

//double 转换为 int 时必须明确定义类型
//否则编译器会丢出错误
i = (int)d;

//int 转换为 double 时则可直接转换
d = i;

为什么会有这样的区别呢?

是因为数据正确性的考量,当类型转换时会有数据失真的问题时,一般使用明确

转换,让使用者可以明确的指定要转换的类型并承担风险。

使用时,要注意几点

1. 必须是static

2. 使用implicit或explicit

3. 搭配operator(此也是c#关键字,可在类或结构声明内重载内建操作符或提供使用者定义的转换)

4. 定义转换类型

5. 传入转换的类型

类定义


public class A
{
    private string _name;

    //将建构子设为私有,代表无法用new关键字new出A类型
    private A(string name)
    {
        _name = "Private Key" + name;
    }

    //隐含转换 接受string类型
    public static implicit operator A(string expandedName)
    {
        return new A(expandedName);
    }

    //明确转换,接受一个StringBuilder类型
    public static explicit operator A(StringBuilder expandedName)
    {
        return new A(expandedName.ToString());
    }

    public override string ToString()
    {
        return _name;
    }
}

Client使用


A a1 = "Hello a1";

Console.WriteLine(a1.ToString());

StringBuilder sb=new StringBuilder("Hello a2");

A a2 = (A)sb;

Console.WriteLine(a2.ToString());

语法的使用上大概是这个样子,但这样看还是没什么感觉,不知道何时该使用吧?

那接下来举个.Net 内部的类为例

在操作XML的时候,经常会使用Linq to XML,而其中有个类是XElement

其构造函数有五个重载:

可以看到第2、4、5的重载第一个参数是传入一个XName类型的参数

XName是XML元素的名称,如: 这样代表一个XName,由于这个类型功能很简单,

所以如果每次都要new XName("")传进去似乎有点多此一举(当然还有一点是跟XNamespace有关,但这边不讨论)

因此.Net 在设计时,将XName建构子的存取子设为internal,并且使用了implicit隐含转换

如此一来在使用上就可以用下面这样的方式叫用


var e = new XElement("Books");

在定义类时,如果有需要,就可以使用这两个关键字来提供类一些额外的功能

但在使用时也必须考虑设计上是否合理

例如当两类有相关性时是否该提取出父类或是界面来使用,而不是为了方便做了一堆转换

导致程序撰写与维护上的困难。

原文:大专栏  类型转换关键字explicit与implicit的用法

原文地址:https://www.cnblogs.com/petewell/p/11490172.html

时间: 2024-10-04 12:59:53

类型转换关键字explicit与implicit的用法的相关文章

C#关键字explicit、implicit、operator 、unsafe 、fixed

今天遇到一些一般不常用,但说不定什么情况下就能用到的C#关键字. 转换关键字 explicit 定义强制转换 // Must be defined inside a class called Fahrenheit: public static explicit operator Celsius(Fahrenheit fahr) { return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32)); } implicit 定义隐性转换 // User-

C# 参考之转换关键字:operator、explicit与implicit

operator operator 关键字用于在类或结构声明中声明运算符.运算符声明可以采用下列四种形式之一: public static result-type operator unary-operator ( op-type operand ) public static result-type operator binary-operator ( op-type operand, op-type2 operand2 ) public static implicit operator co

operator、explicit与implicit

说这个之前先说下什么叫隐式转换和显示转换 1.所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型. 例如:float f = 1.0: double d=f:这样就是把float类型的f隐式转换成double类型了!但其实系统帮我们做了类似如下的工作: float f = 1.0: double d=(double)f: 对于表示数值的基本数据类型来说,数值范围小的数据类型转换成数值范围大的数据类型可以进行隐式转换,而反过来则必须进行显示转换 2.显式类型转

关键字explicit的作用(转)

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 关于explicit关键字,先看看MSDN上的解释: This keyword is a declaration specifier that canonly be applied to in-class constructor declarations. An

Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前在Windows下写程序的时候,基本上没有碰到这个关键字,那么这个关键字是做什么用的呢? 关键字 explicit 可以禁止“单参数构造函数”被用于自动类型转换,主要用于 "修饰 "构造函数. 指明构造函数只能显示使用,目的是为了防止不必要的隐式转化. 光看这一句似乎不太容易明白,下面,举

c++隐式类型转换和explicit

什么是隐式转换? 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了哪些转换. 为什么要进行隐式转换? C++面向对象的多态特性,就是通过父类的类型实现对子类的封装. 通过隐式转换,你可以直接将一个子类的对象使用父类的类型进行返回. 在比如,数值和布尔类型的转换,整数和浮点数的转换等. 某些方面来说,隐式转换给C++程序开发者带来了不小的便捷. C++是一门强类型语言,

php static 关键字在 函数中的用法

至于在类中声明为 static 的属性和方法,这里不描述php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. function test(){    $tVar = 10;    echo $tVar;    $tVar++;} 以上函数每次调用时都会将 $tVar 的值设为 10 并输出 "10".将变量加一的 $tVar++ 没有其到效果,因为一旦退出本

C++ 类类型转换函数explicit 关键字

标准数据之间会进行  隐式类型安全转换. 转换规则: 隐式类型转换的问题: #include <iostream> #include <string> using namespace std; int main() { short s = 'a'; unsigned int ui = 1000; int i = -2000; double d = i; cout <<"d = "<<d<<endl;//输出d = -2000

C# 关键字explicit(显示),implicit(隐式),类型的隐式和显式转换

class Program { static void Main(string[] args) { Adaptee ada = new Adaptee(); Target tar = ada; } } public class Adaptee { public int code = 1; } public class Target { private int data; public Target(int data) { this.data = data; } //可以进行隐式转换 public