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

C# 分配变量C时的异常处理#,c#,.net,exception,variables,variable-assignment,C#,.net,Exception,Variables,Variable Assignment,在做一个项目的时候,我意识到我对C#有些东西真的不了解(在谷歌上也找不到)。如果为变量赋值(已使用默认值初始化),并且该值是由另一个方法创建的,那么如果在另一个方法中出现异常,会发生什么情况。为了澄清,这里举一个例子: eType = defaultvalue; ... eType = (EReaderType)Enum.Parse(typeof(EReaderType), tXmlNode.InnerText, true); 如果Enum.Parse无法解析值(Xml中的字符串,此处不重要…

在做一个项目的时候,我意识到我对C#有些东西真的不了解(在谷歌上也找不到)。如果为变量赋值(已使用默认值初始化),并且该值是由另一个方法创建的,那么如果在另一个方法中出现异常,会发生什么情况。为了澄清,这里举一个例子:

eType = defaultvalue;
...
eType = (EReaderType)Enum.Parse(typeof(EReaderType), tXmlNode.InnerText, true);
如果Enum.Parse无法解析值(Xml中的字符串,此处不重要…)并引发异常,会发生什么情况?eType会保留其默认值,还是会被其他东西(null或一些未定义的blabla)重新赋值?到目前为止,我的测试表明它将保留旧值。然而,我不确定这是否会一直有效,或者这是偶然的。简单地说,我不知道C#如何处理这些事情


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

如果你不确定语法是否会成功,请考虑使用。< /P>
但在您的示例中,在赋值之前必须完全计算右侧,因此处理右侧时出现异常将阻止赋值。

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

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

请根据所涉及的步骤考虑它

如果您有:

var x = SomeOperation();
M().x = N(P()).Q(); // x is a variable
情况就是这样:

  • SomeOperation
    执行
  • 返回值被分配给
    x
  • 如果在
    SomeOperation
    中引发异常,则上述步骤1无法完成。这意味着永远不会达到第2步


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

    正确的推理方法是:

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

    var x = SomeOperation();
    
    M().x = N(P()).Q(); // x is a variable
    
    事情发生的顺序是:

    • M()被执行
    • 确定了x的位置
    • P()被执行
    • N()被执行
    • 执行Q()
    • x的赋值发生了
    如果其中一个抛出异常,那么在异常之后发生的所有事情都不会执行