可以返回char或string的c#方法的返回值或out参数?

时间:2010-11-09 23:13:33

标签: c# coding-style out-parameters

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

  

如果你发现自己需要从API中返回两个东西,那么将它们包装在struct / class中会比out param更好。“

以下是相关代码的代表性示例。它是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值推断要使用哪个char或字符串,或者使用out bool显式?我不想为每个通过此函数的char创建并返回一个元组对象实例,因为这似乎是很多对象创建开销和未来的垃圾收集。

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)

3 个答案:

答案 0 :(得分:4)

如何总是返回一个字符串(长度为0,1或多个),并始终调用writer.Write(string)

答案 1 :(得分:1)

如果你返回一个字符串,为什么不使用“\ u00A9”代替'\ u00A9'.ToString()?

答案 2 :(得分:0)

您是否希望在任何地方单独使用此Translate方法,或者它是否总是用于将一个流的数据写入另一个流的目的?如何将编写器传递给Translate方法,并让它调用适当的writer.Write方法?