隐式与显式强制转换运算符最佳做法

本文关键字:运算符 最佳 转换 | 更新日期: 2023-09-27 18:35:48

我最近在 C# 中发现了转换运算符。现在我知道我可以覆盖运算符以允许:

byte b1 = new Foo();
byte b2 = (byte) new Foo();

但从Foo消费者的角度来看,我不知道哪个更容易理解可以进行转换。我特别考虑的是将来必须/将要维护我的代码的初级程序员(或者如果我几天前看到这个,我会怎么想)。

一方面,隐式选角看起来有点奇怪。它看起来像分配不同的、不兼容的类型。而且 IDE 的智能感知不会告诉您有一种方法可以在编译器不抱怨的情况下做到这一点。

另一方面,显式强制转换看起来像强制转换。好的,这是一种告诉编译器"我知道我在做什么,不要抱怨"的方式。但是,一个无法访问Foo代码(或者不知道 C# 中存在强制转换运算符)的程序员如何执行强制转换并执行预期的事情?

在哪些情况下首选哪种类型的铸件?还有第三种路吗?

隐式与显式强制转换运算符最佳做法

如果Foo本质上显然是数字,并且转换正在扩大,那么隐式转换对使用者很有用。

如果转换正在缩小,则运算符应该是明确的。


如果Foo不是数字(实际上不是Foo),那么它不应该被转换为数字类型。

实现一些其他方法或属性,这些方法或属性将执行将Foo实例转换为数值类型的操作。该函数的名称应为调用方提供语义含义,描述返回的值以及为返回该值而执行的任何操作。


你不应该避免使用编程语言的某些部分,因为读者可能不理解。你应该用简单的散文来注释你的代码,来解释你的决定以及你为什么做出这些决定。解释如何最大限度地利用您的类型。

使用最适合您正在建模的信息系统的语言功能。谁知道呢,读者可能会学到一些东西。

我认为,第二个在你的情况下更具可读性。两者的基础操作是相同的。

请注意,您也可以写:

var b2 = (byte) new Foo();

我认为,如果考虑到可读性,这将是最好的。

怎么?

  1. 您只使用一次byte
  2. 让"未来的程序员"知道你正在铸造Foo并且这种类型的b2是一次性byte使用(byte)