C# 隐式与显式转换运算符最佳实践

C# 隐式与显式转换运算符最佳实践,c#,casting,C#,Casting,我最近在C#中发现了casting操作符。现在我知道我可以覆盖操作符以允许: byte b1 = new Foo(); byte b2 = (byte) new Foo(); 但是从Foo消费者的角度来看,我不知道哪种转换更容易理解。我特别考虑的是那些未来必须维护我的代码的初级程序员(或者如果我几天前看到这一点,我自己会怎么想) 一方面,隐式铸造看起来有点奇怪。它看起来像是分配了不同的、不可兼容的类型。IDE的intellisense不会告诉您有一种方法可以做到这一点,而不会让编译器抱怨 另一

我最近在C#中发现了casting操作符。现在我知道我可以覆盖操作符以允许:

byte b1 = new Foo();
byte b2 = (byte) new Foo();
但是从
Foo
消费者的角度来看,我不知道哪种转换更容易理解。我特别考虑的是那些未来必须维护我的代码的初级程序员(或者如果我几天前看到这一点,我自己会怎么想)

一方面,隐式铸造看起来有点奇怪。它看起来像是分配了不同的、不可兼容的类型。IDE的intellisense不会告诉您有一种方法可以做到这一点,而不会让编译器抱怨

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


在哪种情况下,哪种类型的铸件是首选的?有第三种方法吗?

我想,第二种方法在你的情况下更容易理解。这两者的基础操作是相同的

请注意,您还可以编写:

var b2 = (byte) new Foo();
我认为,如果考虑可读性,这将是最好的

怎么做?-

  • 您只使用了一次
    byte
  • 您让“未来程序员”知道您正在使用
    (byte)
    一次性铸造
    Foo
    ,b2类型是
    byte

  • 如果
    Foo
    本质上明显是数字,并且转换范围正在扩大,那么隐式转换对消费者是有用的

    如果转换正在缩小,则运算符应该是显式的


    如果
    Foo
    不是数字类型(而且
    Foo
    实际上不是),则它不应强制转换为数字类型

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


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


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

    我只会在不丢失信息(如从
    int
    long
    )的情况下使用隐式转换。这取决于上下文,否则与观点有关。我只想扩展一个建议:不要构建适合年轻人的代码,只要确保它是干净的,易于阅读并有很好的文档记录,未来的开发人员应该能够阅读您在代码中的注释,了解这是一个强制转换,以及您为什么要强制转换。@DanielDawes,我认为这与青少年无关。在我看来,代码应该是可读的和明显的,而无需参考文档(当然,有些复杂的场景是可以接受的)。乍一看,取决于
    Foo
    实际上是什么,上面的代码在这两种情况下都令人困惑。穆法卡下面的回答(一种
    ToByte
    method)很有道理,也很有意思。@Moo Juice我指的是一周前的青少年和我自己,在知道强制转换操作符的存在之前。
    Foo
    是一个非常普遍的情况。这解释了为什么我的直觉告诉我,在某些情况下,隐式强制转换是正常的,而在另一些情况下,隐式强制转换看起来很奇怪。