C# 哪一个更可取且成本更低:类匹配与异常?
哪一个更便宜更可取:put1还是put2C# 哪一个更可取且成本更低:类匹配与异常?,c#,java,exception,C#,Java,Exception,哪一个更便宜更可取:put1还是put2 Map<String, Animal> map = new Map<String, Animal>(); void put1(){ for (.....) if (Animal.class.isAssignableFrom(item[i].getClass()) map.put(key[i], item[i]); void put2(){ for (.....) try{ map.put(key[i],
Map<String, Animal> map = new Map<String, Animal>();
void put1(){
for (.....)
if (Animal.class.isAssignableFrom(item[i].getClass())
map.put(key[i], item[i]);
void put2(){
for (.....)
try{
map.put(key[i], item[i]);}
catch (...){}
我很困惑。如果
item[i]
不是Animal
,那么map.put(key[i],item[i])
如何编译
这就是说,第一种方法说明了您打算做什么,尽管我认为instanceof
是一种更好的检查方法。您可能想要:
if (item[i] instanceof Animal)
map.put(key[i], (Animal) item[i]);
这几乎肯定比从调用isAssignableFrom要好得多
或者在C#中(因为您添加了C#标记):
编辑:更新后的问题是哪个更好:instanceof或cast and catch。功能基本相同。绩效差异可能并不显著,我必须对其进行衡量;一般来说,抛出异常的速度很慢,但我不知道其余的情况。所以我会根据风格来决定。说你的意思
如果你总是期望item[i]
是一只动物,而你只是格外小心,抛投和捕捉。否则,我会发现使用instanceof更为清晰,因为它清楚地表达了您的意思:“如果这个对象是动物,请将它放在地图上。”通常,异常处理会明显慢一些,因为它应该用于异常的事情(很少发生),虚拟机制造商在加速它方面没有花费太多的精力
<>您的代码的Tr/catch版本,我认为是滥用异常处理,永远不会考虑这样做。您正在考虑这样做的事实可能意味着您的设计很差,项目可能应该是动物[]而不是其他东西,在这种情况下,您根本不需要在运行时进行检查。让编译器为您完成工作。我同意前面的答案-这不会编译
但是,在我看来,它是例外还是检查取决于函数的用途
项目[i]不是动物是错误/例外情况吗?预计这种情况很少发生吗?在这种情况下,它应该是一个例外
如果它是逻辑的一部分——也就是说,你期望项目[i]是很多东西——并且只有当它是你想放在地图上的动物时。在这种情况下,instanceof check是正确的方法
更新:
我还将添加一个示例(有点蹩脚):
哪一个更好:
(一)
这取决于程序的功能。(1) 可用于计算任何整数输入小于100的数字。(2) 如果processNumber期望百分比值不能大于100,则将使用
不同的是,程序(2)的数量大于100是一个错误。然而,对于程序(1),aNumber>100是有效的,但是只有当aNumber<100时才会发生“某事”
PS-这可能对您没有任何帮助,如果是这样的话,我很抱歉。您的两个选择并不完全相同。选择哪一个完全取决于您的代码应该做什么:
- 如果预期该项目始终为
一只
动物
,那么你应该使用
put2
(如果
事实并非如此……)
- 如果项目可能是,也可能不是
Animal
,您应该使用put1
(其中
检查条件,而不是错误…)
如果您正在编写代码,那么一开始就不要关心性能 以下也是有效的c#(只是为了与Java示例进行比较:if(item[i]是Animal)map[key[i]=(Animal)item[i];哦,还有+1顺便说一句,回答不错:)它是有效的c#,但它也不如使用作为
。检查if更好,因为:1。FOR循环将执行更少的map.put(),异常版本将调用map.put(),每次不满足条件时都会产生异常。2.创建异常的过程是非常复杂的,它占用堆栈上的内存,在CPU注册表中产生更改等等,任何方式都比简单的简单多,请根据我对问题的修改修改您的答案。问题不是关于instanceof vs isassignablefrom,而是instanceof/isassignablefrom vs cast异常。请根据我对问题的修改修改您的答案。问题是instanceof/isassignablefrom vs cast异常。听起来你高估了原始CPU速度的问题。您应该更加关注什么是正确、清晰、可读和惯用的Java代码。只有在极少数的情况下,你才会为了减少几个时钟周期而想要扭曲它。
if (item[i] instanceof Animal)
map.put(key[i], (Animal) item[i]);
var a = item[i] as Animal;
if (a != null)
map[key[i]] = a;
if ( aNumber < 100 ) {
processNumber(aNumber);
}
try {
processNumber(aNumber); //Throws exception if aNumber >= 100
} catch () {
}