码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-09 10:29:25      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:撰写   default   语法   目的   operator   参数   ref   转换   相关性   

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

标签:撰写   default   语法   目的   operator   参数   ref   转换   相关性   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!