コードレビュー中に、正しくないように見えるコードに出くわしましたが、それを変更する「最善の」方法はわかりません。答えを探していると、nullableまたはブール値のreturn + outパラメーターと、戻り値またはoutパラメーターのどちらが優れているかを使用して、どちらが優れているかを見つけました。 後者には、私が一般的に同意するこのコメントに関する回答がありました。
API から 2 つのものを返す必要がある場合は、それらを構造体/クラスにまとめる方が、out パラメータよりも優れています。」
問題のコードの代表的なサンプルを次に示します。これは 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 で明示的にしますか? この関数を通過するすべての 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)