2010-11-09 63 views
1

我在代碼審查過程中遇到了一些代碼,看起來不太合適,但不確定「最好」的方式來更改它。在尋找一個一個答案,我發現which is better, using a nullable or a boolean return+out parameterWhich is better, return value or out parameter?後者曾與此評論,我基本同意了答案:可返回字符或字符串的c#方法的返回值或輸出參數?

如果你發現自己需要從API返回兩件事情,然後包裹起來的結構/類將是比出來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值推斷要使用哪個字符或字符串,還是使用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) 

回答

4

怎麼樣總是返回一個字符串(長度爲0,1或多),總是調用writer.Write(string)

+0

因爲它爲緩衝區的每個字符創建一個新的字符串。如果我輸出10,000個字符,我是否希望我的方法創建10,000個字符串對象? – 2010-11-09 23:25:23

+1

我的示例代碼中沒有在* strings *上使用「新」關鍵字。你有沒有測試過它?這真的發生了嗎?我想你會發現你在巨型開關中聲明的字符串是實習的。另一方面(這只是猜測,你應該始終配置文件),你可能想遠離字符數組,因爲他們沒有這樣的優化。 – 2010-11-09 23:41:10

0

您是否期望在任何地方獨立使用此翻譯方法,還是總是用於將一個流的數據寫入另一個?如何將作者傳遞給Translate方法,並讓它調用適當的writer.Write方法?

1

如果你返回一個字符串,爲什麼不使用「\ u00A9」而不是'\ u00A9'.ToString()?

+0

是的,這將更好地利用字符串實習。 +1 – 2010-11-10 08:03:55