这篇是个语法文,虽然这两个关键字比较陌生,但让自己有个印象不是坏事
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