一个例子是:
XNamespace ns = "my namespace"
为什么不呢?
XNamespace ns = new XNamespace ( "my namespace" )
使用隐式/显式转换而不是构造函数背后的想法是什么?方便吗?
有这方面的指南吗?
最佳答案
Convenience?
或多或少,是的。考虑一下当您有一个类似数字的对象(例如,一个 Complex
)并在其上进行计算时的情况。显然,编写如下代码:
Complex result = c1 * new Complex(2) + new Complex(32);
非常烦人且难以阅读。隐式转换在这里有所帮助(在此示例中,另一种方法是运算符重载,但这会导致许多类似的重载)。
Is there a guideline for this?
提供尽可能少的隐式转换,因为它们可能隐藏问题。隐式转换降低显式性的程度与它们增加简洁性的程度相同。有时这很好,但有时则不然。
我发现最好将隐式转换限制为非常相似的类型,例如我上面示例中的类似数字的对象:int
本质上是一个 复杂
(从数学的角度来看;即使它不是通过继承建模的),因此隐式转换是有意义的。
在 VB 中,隐式转换称为“Widening
”(与 Narrowing
相对,后者是 explicit
),这很好地描述了它: 在转换过程中没有信息丢失。
此外,运算符本质上是一个构建器函数,并且具有构建器函数相对于构造函数的(部分)常见优势:即,它可以重复使用缓存的值,而不是总是创建新实例。
考虑我的 Complex
示例。我们可能希望缓存常用复数的值:
Class Complex {
// Rest of implementation.
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);
}
}
当然,这种微优化是否有效是另一个问题。
关于c# - 使用隐式/显式转换而不是构造函数的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815695/