Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪一个更可取且成本更低:类匹配与异常?_C#_Java_Exception - Fatal编程技术网

C# 哪一个更可取且成本更低:类匹配与异常?

C# 哪一个更可取且成本更低:类匹配与异常?,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],

哪一个更便宜更可取: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], 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 () {
}