6.5 用户定义的数据类型转换
本章前面介绍了如何在预定义的数据类型之间转换数值,这是通过数据类型转换过程来完成的。C#允许进行两种不同数据类型的转换:隐式转换和显式转换。
显式转换要在代码中显式标记转换,其方法是在圆括号中写出目标数据类型:
int I = 3; long l = I; // implicit short s = (short)I; // explicit |
对于预定义的数据类型,当数据类型转换可能失败或丢失某些数据时,需要显式转换。 例如:
● 把int转换为short时,因为short可能不够大,不能包含转换的数值。
● 把有符号的数据转换为无符号的数据,如果有符号的变量包含一个负值,会得到不正确的结果
● 在把浮点数转换为整数数据类型时,数字的小数部分会丢失。
● 把可空类型转换为非可空类型,null值会导致异常。
此时应在代码中进行显式转换,告诉编译器你知道这会有丢失数据的危险,因此编写代码时要把这种可能性考虑在内。
C#允许定义自己的数据类型(结构和类),这意味着需要某些工具支持在自己的数据类型之间进行类型转换。方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须标记为隐式或显式,以说明如何使用它。我们应遵循与预定义数据类型转换相同的规则,如果知道无论在源变量中存储什么值,数据类型转换总是安全的,就可以把它定义为隐式转换。另一方面,如果某些数值可能会出错,例如丢失数据或抛出异常,就应把数据类型转换定义为显式转换。
提示:
如果源数据值会使数据类型转换失败,或者可能会抛出异常,就应把定制数据类型转换定义为显式转换。
定义数据类型转换的语法类似于本章前面介绍的重载运算符。但它们是不一致的,数据类型转换在某种情况下可以看作是一种运算符,其作用是从源类型转换为目标类型。为了说明这个语法,下面的代码是从本节后面介绍的结构Currency示例中节选的:
public static implicit operator float (Currency value)
{
// processing
}
|
运算符的返回类型定义了数据类型转换操作的目标类型,它有一个参数,即要转换的源对象。这里定义的数据类型转换可以隐式地把Currency的值转换为float型。注意,如果数据类型转换声明为隐式,编译器可以隐式或显式地使用这个转换。如果数据类型转换声明为显式,编译器就只能显式地使用它。与其他运算符重载一样,数据类型转换必须声明为public和static。
注意:
C++开发人员应注意,这种情况与C++是不同的,在C++中,数据类型转换是类的实例成员。
| 回书目 上一节 下一节 |