【发布时间】:2020-02-18 06:38:02
【问题描述】:
以 w3school 为例:
int myInt = 9;
double myDouble = myInt; // Automatic casting: int to double
Console.WriteLine(myInt); // Outputs 9
Console.WriteLine(myDouble); // Outputs 9
和
double myDouble = 9.78;
int myInt = (int) myDouble; // Manual casting: double to int
Console.WriteLine(myDouble); // Outputs 9.78
Console.WriteLine(myInt); // Outputs 9
显式转换是否会增加额外的开销,尤其是对于大量数字/数组?还是和隐式转换一样?
出于学术原因,我不得不问这个问题,并且还想在任何地方显式地转换我的对象和接口以增加代码库的清晰度。
编辑:
添加动物示例:
IAnimal animal = (IAnimal) dog;
IAnimal animal = dog;
【问题讨论】:
-
隐式与显式是语法上的区别。不管怎样,它正在发生;它生成的 IL 是相同的。处理方面没有区别,两者之间没有额外的开销。
-
如果您在代码中可以进行隐式强制转换的地方放置显式强制转换,Visual Studio 2019 将调暗强制转换并为您提供代码修复以删除不必要的强制转换。隐式转换可以让您的生活更轻松。
-
我明白了,所以它更像是语法糖,那么接口呢?它仍然在 IL 上生成相同的代码吗?例如上面的动物
-
是的。如果转换是隐式的,不管是接口还是基类,都是一样的。当一个值类型被隐式转换为接口时,它必须首先装箱该值,无论它是隐式转换还是显式转换。与用户定义的隐式转换操作符相同,它仍然需要调用操作符的
op_Implicit方法。 -
你做错了。通过学习十亿个单独的规则并始终应用它们,您不会获得性能良好的代码。 当您需要性能良好的代码时,您可以设定目标,编写满足要求的简单代码,然后根据目标衡量代码。只有当它不符合目标时,您才会开始深入研究为什么它表现不佳,然后您实际上可以尝试替代方案并查看 a) 是否有所作为,b) 是否有所不同重要到足以让它现在通过目标。