【问题标题】:Exception handling when assigning a variable C#分配变量时的异常处理 C#
【发布时间】:2011-06-16 16:08:37
【问题描述】:

在从事一个项目时,我意识到我对 C# 确实不了解(而且我在 google 上也找不到任何相关信息)。如果你给一个变量赋值(它已经用默认值初始化了),并且这个值是由另一个方法创建的,如果你在另一个方法中得到一个异常会发生什么。为了澄清,这里举个例子:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      正确的推理方式是:

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

      假设你有:

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

      事情发生的顺序是:

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

      如果其中一件事情引发了异常,那么在异常之后发生的所有事情都不会执行。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          如果你有:

          var x = SomeOperation();
          

          会发生这样的事情:

          1. SomeOperation 执行。
          2. 返回值赋值给x

          如果在SomeOperation 中引发异常,则上述步骤 1 不会完成。这意味着永远无法达到第 2 步。

          据我所知,这是有保证的、确定性的事件顺序。所以你不必担心x 会突然被赋予一些不可预测的值。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-03-04
              • 1970-01-01
              • 2013-05-13
              • 2016-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多