【问题标题】:Return value or out parameter for c# method that can return either a char or string?c# 方法的返回值或输出参数,可以返回字符或字符串?
【发布时间】:2010-11-09 23:13:33
【问题描述】:

我在代码审查期间遇到了一些看起来不正确的代码,但不确定更改它的“最佳”方法。在寻找答案时,我发现了which is better, using a nullable or a boolean return+out parameterWhich is better, return value or out parameter? 后者对此评论有一个我普遍同意的答案:

如果您发现自己需要从 API 返回两个东西,那么将它们包装在结构/类中会比输出参数更好。”

以下是相关代码的代表性示例。它是 Web 应用程序的一部分,基本上循环通过字符缓冲区,并希望将“不可打印”字符转换为替换字符或字符串。为此,Translate 方法的作者总是返回一个字符串,调用者必须转换回字符数组。

string character = Translate(value);
if (character.Length == 1) {
    writer.Write(character[0]);
} else {
    writer.Write(character.ToCharArray());
}

public string Translate(char value) {
    if (value <= '\u017F') {
        return value.ToString();
    }

    switch (value) {
        case '\u2117':
            return '\u00A9'.ToString();  // copyright sign
        case '\u211E':
            return "Rx"; // prescription
        // ... and lots more case statements
    }

    return value.ToString();
}

在我看来,我有几个选择。我是让调用者根据 null 或 String.Empty 值推断要使用哪个字符或字符串,还是使用 out bool 明确?我不想为通过此函数的每个字符新建并返回一个元组对象实例,因为这似乎有很多对象创建开销和未来的垃圾收集。

public string Translate(char value, out char newValue)
public void Translate(char value, out char? newCharValue, out string newStringValue)
public void Translate(char value, out bool useChar, out char newCharValue, out string newStringValue)

【问题讨论】:

    标签: c# coding-style out-parameters


    【解决方案1】:

    总是返回一个字符串(长度为 0、1 或多个)并总是调用writer.Write(string) 怎么样?

    【讨论】:

    • 因为它为缓冲区的每个字符创建一个新字符串。如果我输出 10,000 个字符,我是否希望我的方法创建 10,000 个字符串对象?
    • 我没有看到您的示例代码中的 strings 上使用了“new”关键字。你测试过吗?这真的会发生吗?我想你会发现你在你的巨大开关中声明的字符串文字是实习的。另一方面(这只是推测,您应该始终配置文件),您可能希望远离字符数组,因为它们没有这样的优化。
    【解决方案2】:

    如果您返回一个字符串,为什么不使用“\u00A9”而不是“\u00A9”.ToString()?

    【讨论】:

    • 是的,这将更好地利用字符串实习。 +1
    【解决方案3】:

    您希望在任何地方独立使用此 Translate 方法,还是总是将其用于将一个流的数据写入另一个流?将 writer 传递给 Translate 方法,并让它调用适当的 writer.Write 方法怎么样?

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 2019-04-29
      • 2017-01-11
      • 1970-01-01
      • 2023-03-20
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多