.Net if esle 和try catch 的效率问题

shizheng163 2017-07-19 04:04:49
根据前辈们的帖子知道 try catch的效率比if esle 更低一些
但是 如果if else中调用了一些函数呢?
比如如下两种写法 哪种效率更高一点
写法1

var DictGender = new Dictionary<string, int>();
DictGender["男"] = 1; DictGender["女"] = 2;
if (DictGender.Keys.Contains(row["性别"].ToString()))
row["性别"] = DictGender[row["性别"].ToString()];
else
throw new Exception("性别输入不规范,应该为(男,女),您的输入为:" + row["性别"].ToString());

写法二:

var DictGender = new Dictionary<string, int>();
DictGender["男"] = 1; DictGender["女"] = 2;
try
{
row["性别"] = DictGender[row["性别"].ToString()];
}
catch {
throw new Exception("性别输入不规范,应该为(男,女),您的输入为:" + row["性别"].ToString());
}


这两个方法是要包含到循环中的 可能要执行几万次
...全文
258 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2017-07-19
  • 打赏
  • 举报
回复
引用 10 楼 masanaka的回复:
[quote=引用 5 楼 duanzi_peng 的回复:] [quote=引用 4 楼 shizheng163 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。
那如果dic里数据较多 这种写法是否可以? [/quote] 可以,放心去用。[/quote] 哪怕是需要去查数据库,都不应该用try catch去处理。 你是个不负责任的版主。 不用回我,没空和你口舌。 [/quote] 好的,我是从WPF版块转来的,也是在学习中,你有能力把我撤掉,没能力别bb喔,会污染空气的。
threenewbee 2017-07-19
  • 打赏
  • 举报
回复
嗯,try catich效率低,你永远都不要用它。
ilikeff8 2017-07-19
  • 打赏
  • 举报
回复
try是为了增加程序强壮性的,防止一些你没预料到的错误,而不是为了什么效率之争,现在的电脑性能,这种内存中的效率之分很多时候是可以忽略的,除非数据量特别大,但那也不是try和if用哪个的问题,通常你都要用,用if做数据检查,用try做异常捕获
masanaka 2017-07-19
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 shizheng163 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。
那如果dic里数据较多 这种写法是否可以? [/quote] 可以,放心去用。[/quote] 哪怕是需要去查数据库,都不应该用try catch去处理。 你是个不负责任的版主。 不用回我,没空和你口舌。
masanaka 2017-07-19
  • 打赏
  • 举报
回复
既然你后面都throw new Exception了,再纠结这个性能有什么意义吗? 楼上已经有人说了,你这属于业务逻辑,不应该以异常的形式抛出。 而且,单从你的代码片段来看,row["性别"] 里不存在“性别”这个field,或者row本身是个null,也会异常,那你后面抛出的异常信息就完全风牛马不相及。 这个地方用try catch,是糟糕的不能再糟糕的做法。
shizheng163 2017-07-19
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 shizheng163 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。
那如果dic里数据较多 这种写法是否可以? [/quote] 可以,放心去用。[/quote] 谢谢
shizheng163 2017-07-19
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
try catch异常就崩溃了,你后面几万次都执行不了了,除非你外面有try catch包含做了处理,不过如果你外部能处理,那内部这个异常就没必要抛出了吧 而且如楼上所说,你这种可以判断的,属于业务逻辑,不应该以异常的形式抛出
主要是 如果数据有好几万条 而且每条数据都没有问题 如果每次都要用if(dic.contains(....))这种形式来写 会不会造成等待的时间太长 而且字典中的数据有多少是不确定的 这个得看用户定义了多少子类
shizheng163 2017-07-19
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
性别这种字段无非就是男女,为何还需要放字典,用两个常量或者定个枚举判断就行了,另外强烈不推荐把能判断出来的异常丢给try catch
男女只是一种写法的示例,可能某个类别下有好几十个子类 这种情况下 用if 来判断给定的值是否存在字典中是否会对效率有影响?
exception92 2017-07-19
  • 打赏
  • 举报
回复
引用 4 楼 shizheng163 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。
那如果dic里数据较多 这种写法是否可以? [/quote] 可以,放心去用。
shizheng163 2017-07-19
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。
那如果dic里数据较多 这种写法是否可以?
  • 打赏
  • 举报
回复
try catch异常就崩溃了,你后面几万次都执行不了了,除非你外面有try catch包含做了处理,不过如果你外部能处理,那内部这个异常就没必要抛出了吧 而且如楼上所说,你这种可以判断的,属于业务逻辑,不应该以异常的形式抛出
xdashewan 2017-07-19
  • 打赏
  • 举报
回复
性别这种字段无非就是男女,为何还需要放字典,用两个常量或者定个枚举判断就行了,另外强烈不推荐把能判断出来的异常丢给try catch
exception92 2017-07-19
  • 打赏
  • 举报
回复
这个说不上来,只要dic里数据量不大,if取值判断不会耗时,最好还是实际测试一下。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧