分配变量C#时的异常处理

时间:2011-01-27 16:16:39

标签: c# .net exception variables variable-assignment

在开展一个项目时,我意识到我真的不知道C#(我在谷歌上也找不到任何关于它的东西)。如果为变量赋值(已使用默认值初始化),并且该值由另一个方法创建,则在另一个方法中获得异常会发生什么。为了澄清,这里有一个例子:

eType = defaultvalue;
...
eType = (EReaderType)Enum.Parse(typeof(EReaderType), tXmlNode.InnerText, true);

如果Enum.Parse无法解析值(Xml中的字符串,这里不重要......)会引发异常,会发生什么? eType会保留其默认值,还是会被其他东西重新分配(null或某些未定义的blabla)?到目前为止,我的测试显示它将保留旧值。但是,我不确定这是否会一直有效,或者是不是偶然的。简单地说,我不知道C#如何处理这些东西。

编辑:好的,非常感谢所有答案:)

5 个答案:

答案 0 :(得分:17)

如果您不确定解析是否会成功,请考虑改为使用Enum.TryParse

但是在您的示例中,必须在分配发生之前完全评估右侧,因此处理右侧时的异常将阻止分配。

答案 1 :(得分:8)

理由的正确方法是:

  • 子表达式的副作用从从左到右执行
  • 运算符的副作用优先顺序执行。

假设你有:

M().x = N(P()).Q(); // x is a variable

事情发生的顺序是:

  • 执行M()
  • 确定x的位置
  • 执行P()
  • 执行N()
  • 执行Q()
  • x的分配发生

如果其中一个引发异常,则异常后发生的所有事情都不会执行。

答案 2 :(得分:2)

变量将保留其旧值,因为实际的eType =(计算值)操作不会被执行,因为它会在计算该值的过程中抛出异常(在这种情况下解析字符串)

答案 3 :(得分:2)

根据所涉及的步骤来考虑它。

如果你有:

var x = SomeOperation();

这就是:

  1. SomeOperation执行。
  2. 返回值已分配给x
  3. 如果在SomeOperation内抛出异常,则上述步骤1无法完成。这意味着永远不会达到第2步。

    据我所知,这是一个有保证的,确定性的事件顺序。因此,您无需担心x突然被分配了一些不可预测的值。

答案 4 :(得分:1)

据我所知,它会在第二次分配时抛出异常,最终不会保存新值,保留旧值