【问题标题】:What should the out value be set to with an unsuccessfull TryXX() method?不成功的 Try() 方法应该将 out 值设置为什么?
【发布时间】:2009-05-14 08:32:20
【问题描述】:

我正在实现一个 TryParse(string s, Out object result) 方法。 如果解析失败,我不想触及 out 参数,因此任何先前的结果都将保持不变。 但是VS2k8不会让我。无论如何,我都必须设置 out 对象的值。

为了取悦编译器,我应该只输入 result = result 吗?我错过了什么吗?

【问题讨论】:

    标签: c# .net tryparse


    【解决方案1】:

    分配 null (或更一般的 default(T) )。你必须分配一个值,这就是“out”的意思。

    【讨论】:

    • 嗯,这似乎是共识,确实会如此。如果我可以选择将我的变量设置为回退值,我会更喜欢它,然后执行 tryparse 并使用现在具有有效解析值或回退值的变量。
    • 您可以使用 'ref' 参数来做到这一点,但随后您就偏离了(无论好坏)成为“标准习语”的东西。
    • @boris - default(T) 的后备值是安全的。通常,如果调用代码被赋予false,则调用代码甚至不应该真正查看此值。
    【解决方案2】:

    您对 result = result 的建议不起作用,因为它是一个 out 参数 - 它并没有明确指定以开始,因此在 您已经 指定之前您无法读取它的值给它一个价值。

    result = null;
    

    绝对是使用object out 参数的正确方法。基本上将default(T) 用于您拥有的任何类型T。 (default 运算符在泛型方法中很有用 - 对于非泛型代码,我通常只使用 null, 0 等等。)

    编辑:根据 Boris 的评论,可能值得详细说明 ref 参数和 out 参数之间的区别:

    输出参数

    • 不必必须由调用者明确指定
    • 在方法开始时被视为“未明确赋值”(如果不先赋值就无法读取值,就像局部变量一样)
    • 必须在方法正常终止之前(即在它返回之前;它可以在不为参数分配值的情况下抛出异常)明确地分配(由方法)

    参考参数

    • 是否必须由调用者明确指定
    • 在方法开始时被视为“明确分配”(因此您无需先分配即可读取该值)
    • 不必在方法内赋值(即您可以保留参数的原始值)

    【讨论】:

    • 因此,覆盖 out par 最初具有的任何值是一个可接受的过程?
    • 这已被接受:它是必需的。在方法正常终止(即返回而不是抛出)之前,必须明确分配输出参数必须
    • 否则是不可能的。这就是“out”的意思——客户端值将被(覆盖)写入。 'out' 优于 'ref' 的优点是客户端无需费心初始化变量,他只需声明它,确保在传入 'out' 位置时会设置一些 'initial' 值。
    • 我认为值得编辑答案以澄清这一点:)
    • 我不知道 out vs ref。是否有一种常用的形式与 ref par 一起使用,比如您有 TryXx() for out?
    【解决方案3】:
    result = null;
    

    【讨论】:

    • 那我就随便摸一下参数。这基本上是我的问题。
    【解决方案4】:

    只需输入一些默认值。例如 Int32.TryParse 方法置零。

    【讨论】:

      【解决方案5】:

      如果您不想分配值,则可以使用 ref 而不是 out,尽管这必须由调用者初始化。

      【讨论】:

        【解决方案6】:

        您可以在应该设置结果的代码之前抛出异常。

        【讨论】:

        • TryParse 方法不应该在解析无效的情况下抛出异常。这可能会被视为违反隐含合同
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 2017-04-06
        相关资源
        最近更新 更多