繁体   English   中英

隐式vs显式转换运算符最佳实践

[英]Implicit vs explicit casting operator best practices

我最近在C#中发现了铸造操作员。 现在我知道我可以覆盖运算符以允许:

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

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

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

另一方面,显式转换看起来像强制转换。 好吧,这是告诉编译器的一种方式“我知道我在做什么,不要发牢骚”。 但是,如果程序员无法访问Foo的代码(或者不知道C#中存在转换运算符),那么可以执行转换并做一些预期的事情呢?

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

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

如果转换正在缩小,那么运营商应该是明确的。


如果Foo不是数字(并且Foo确实不是数字),则它不应该可转换为数字类型。

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


你不应该避免编程语言的一部分,因为读者可能不理解。 您应该使用简单的散文评论您的代码,以解释您的决定以及您制作它们的原因。 解释如何最大限度地利用您的类型。

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

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

请注意,您还可以写:

var b2 = (byte) new Foo();

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

怎么样? -

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM