c# - 使用隐式/显式转换而不是构造函数的原因是什么?

标签 c# .net constructor type-conversion base-class-library

一个例子是:

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/

相关文章:

c# - 如何在 C# 中创建全局变量?

.net - 有关调试器使用的调试引擎的信息

c# - 如何在页面刷新时传递字符串?`

c# - 扩展 C# 语言?

C++ 构造函数

reactjs - 如何使用 React Hooks 将带有构造函数的类转换为功能组件?

types - Isabelle:对于构造函数使用公理化和数据类型有区别吗

c# - 多线程: Value and Reference types

c# - 更改框架 4.0 中数组的 Com Interop 表示?

c# - 正则表达式命令循环中出现内存不足错误?