方便吗?
大体上是的。考虑这样一种情况,当您有一个类似数字的对象(比如一个Complex
)需要进行计算时。很明显,编写以下代码:
Complex result = c1 * new Complex(2) + new Complex(32);
强制类型转换会使代码难以阅读,因此可以使用隐式类型转换来改善这种情况(在本例中的另一种替代方法是使用运算符重载,但这样会导致大量相似的重载)。
有没有指导方针?
尽可能提供少量的隐式类型转换,因为它们可能会隐藏问题。隐式类型转换会在同等程度上减少显式性并增加简洁性。有时这是好的,但有时不是。
我发现最好将隐式类型转换限制在非常相似的类型之间,例如我的示例中类似于数字的对象:从数学上讲,一个int实际上是一个Complex(即使它不是通过继承建模的),因此隐式转换是有意义的。
在VB中,隐式类型转换称为“Widening
”(与Narrowing
相对应,后者是explicit
),这很好地描述了它:在转换过程中不会丢失任何信息。
此外,操作符本质上是一个构造函数,并具有构造函数相对于构造器的一些优点:即它可以重用缓存的值,而不总是创建新实例。
考虑我的Complex
示例。我们可能希望为经常使用的复数缓存值:
Class Complex {
private static Complex[] cache = new[] {
new Complex(-1), new Complex(0), new Complex(1) };
public implicit operator Complex(int value) {
if (value >= -1 && value <= 1)
return cache[value];
else
return new Complex(value);
}
}
当然,这种微优化是否有效是另一个问题。