Возвращаемое значение или параметр out для метода c #, который может возвращать либо символ, либо строку? - PullRequest
1 голос
/ 10 ноября 2010

Я наткнулся на некоторый код во время проверки кода, который мне показался неправильным, но я не уверен, что это «лучший» способ изменить его. В поисках ответа я нашел , что лучше, используя обнуляемый или логический параметр return + out и Что лучше, возвращаемое значение или параметр out? Последний имел ответ с этим комментарием, с которым я в целом согласен:

Если вы обнаружите, что вам нужно вернуть две вещи из API, тогда лучше заключить их в структуру / класс, чем в out-параметр. "

Вот типичный пример кода, о котором идет речь. Он является частью веб-приложения и в основном циклически перебирает символьный буфер и хочет преобразовать «непечатные» символы либо в символ замены, либо в строку. Для этого автор метода 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)

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Как насчет того, чтобы всегда возвращать строку (длиной 0, 1 или много) и всегда вызывать writer.Write(string)?

1 голос
/ 10 ноября 2010

Если вы возвращаете строку, почему бы не использовать «\ u00A9» вместо «\ u00A9» .ToString ()?

0 голосов
/ 10 ноября 2010

Планируете ли вы использовать этот метод Translate где-либо отдельно или всегда будет использоваться для записи данных одного потока в другой? Как насчет передачи писателя в метод Translate и позволить ему вызвать соответствующий метод writer.Write?

...