我在代码审查期间遇到了一些似乎不对的代码,但不确定更改它的“最佳”方法。在寻找答案时,我发现which is better, using a nullable or a boolean return+out parameter和Which 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)
答案 0 :(得分:4)
如何总是返回一个字符串(长度为0,1或多个),并始终调用writer.Write(string)
?
答案 1 :(得分:1)
如果你返回一个字符串,为什么不使用“\ u00A9”代替'\ u00A9'.ToString()?
答案 2 :(得分:0)
您是否希望在任何地方单独使用此Translate方法,或者它是否总是用于将一个流的数据写入另一个流的目的?如何将编写器传递给Translate方法,并让它调用适当的writer.Write
方法?