2013-10-17 29 views
3

我最近在C#中发现了铸造操作符。现在我知道我可以重写操作成实现:隐式与显式铸造操作员最佳实践

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

但从一个消费者Foo我不知道这将是更容易理解,一个转换可制成点。我特别想到那些将来必须维护我的代码的初级程序员(或者如果我前几天看到过这种情况,我会怎么想)。

一方面隐式转换看起来有点奇怪。它看起来像分配不同的不兼容类型。 IDE的intellisense不会告诉你有一种方法可以在编译器不抱怨的情况下做到这一点。

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

在哪种情况下,哪种类型的铸件更受欢迎?有第三种方法吗?

+1

我会使用隐式投射只有当没有信息从'int'到'long'丢失。 – Jehof

+2

这取决于上下文,否则它的意见。 – Jodrell

+0

我只想扩展一个建议:不要构建代码来适应后辈,只要确保它是干净的,易于阅读和记录良好的,未来的开发人员应该能够在代码中阅读您的注释,并确定它是一个演员,和*为什么*你正在铸造它。 –

回答

7

如果Foo在本质上是明显的数字byte一气呵成,和转换正在扩大那么隐式转换对消费者有用。

如果转换缩小,那么操作员应该是明确的。


如果Foo不是数字(和Foo真的没有),那么它不应该被强制转换为数值型。

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


你不应该避免编程语言的一部分,因为读者可能不明白。你应该用简单的散文来评论你的代码,解释你的决定以及你为什么做出这些决定。解释如何使用你的类型来获得最大的优势。

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

+0

这解释了为什么我的直觉告诉我,在某些情况下,隐式投射是好的,而其他的看起来很奇怪。 –

1

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

注意,你也可以这样写:

var b2 = (byte) new Foo(); 

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

如何? -

  1. 您只使用byte一次。
  2. 你让“未来的程序员”知道你铸造Foo和B2型是利用(byte)
+0

'Foo'是一个非常通用的情况。 – Jodrell