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

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型转换关键字explicit与implicit的用法相关的知识,希望对你有一定的参考价值。

类型转换关键字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的用法


以上是关于类型转换关键字explicit与implicit的用法的主要内容,如果未能解决你的问题,请参考以下文章

(46)C#里使用自定义类型转换(Implicit和Explicit关键字)

C#中的explicit和implicit了解一下吧

语言基础:关键字explicit

C++11 新特性 之 explicit关键字 - 显示构造与隐式构造

c++ 类型转换与explicit

c++ 类型转换与explicit