Проверьте на NULL и верните строку, если необходимо - каковы "за" / "против" - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть простой класс, в котором реализовано ToString, и я доволен содержанием. Я пытаюсь решить, каков (наиболее) правильный путь, проверяя, есть ли какие-либо плюсы / минусы для различных вариантов.

Для примера ниже:

  • Класс: Astronaut
  • Переменная типа Astronaut: person

Варианты, что я просто снежный ком тут:

  1. string result = person == null ? "Unknown Astronaut" : person.ToString();
  2. string result = person.ToString() ?? "Unknown Astronaut";
  3. string result = (person ?? "Unknown Astronaut").ToString();
  4. string result = person ?? (object)"Unknown Astronaut";

Мои взгляды на это

  1. Очень многословно, и мне не нужен этот уровень многословия.
  2. Гораздо лучше, чем 1, но ToString чувствует себя ужасно и беспокоится об исключениях в этом ToString коде.
  3. Это кажется популярным ( здесь & здесь ), но я не уверен, что это будет работать. Не будет ли компилятор жаловаться на то, что тип string & Astronaut не относится к тому же типу и, следовательно, не может использоваться в coalese.
  4. Это то, что мне больше всего нравится сейчас, но это означает, что поле & ToString должно person быть нулевым.

В итоге:

  • Есть ли какие-либо доводы "за" / "против" любого из вышеперечисленных?
  • Какие варианты вы можете придумать?

Ответы [ 4 ]

6 голосов
/ 18 апреля 2011

Я предпочитаю метод расширения:

public static string SafeToString(this Object obj)
{
   return obj.SafeToString(string.Empty);
}

public static string SafeToString(this Object obj, string defaultString)
{
   return obj == null ? defaultString : obj.ToString();
}

Итак, на ваш вопрос:

string result = person.SafeToString("Unknown Astronaut");
3 голосов
/ 18 апреля 2011

Создайте статический метод ToString и просто вызовите его следующим образом:

string result = Astronaut.ToString(person);

Лучший способ выделить общий код.

1 голос
/ 18 апреля 2011

Я помню книгу о шаблонах проектирования, рассказывающую мне о каком-то объекте, который вы создаете для единственной цели заполнения пустых объектов.Они будут возвращать такие вещи, как пустая строка для имени, 0 для длины и так далее.Не похоже на плохую идею.

Вы также можете реализовать его как статический метод класса Astronaut:

String result = Astronaut.getName(person);
0 голосов
/ 18 апреля 2011

Вы также можете разместить статический метод в классе, который преобразует астронавта в строку или возвращает «Неизвестный астронавт», если аргумент был нулевым.

Аналогичным образом вы можете сделать его методом расширения ивызывайте его непосредственно для переменной этого типа, даже если она равна нулю.

...