По вашему мнению, что более читабельно: ?? (оператор) или использование if's - PullRequest
3 голосов
/ 24 августа 2009

У меня есть метод, который получит string, но прежде чем я смогу с ним работать, я должен преобразовать его в int. Иногда это может быть null, и я должен изменить его значение на "0". Сегодня у меня есть:

public void doSomeWork(string value)
{
   int SomeValue = int.Parse(value ?? "0"); //it can throw an exception(i know)
}

Я сделал это, но мой начальник попросил меня изменить его на:

public void doSomeWork(string value)
{
    if(string.IsNullOrEmpty(value))
        value = "0";
    int SomeValue = int.Parse(value);
}

по вашему мнению, какой вариант лучше?

Ответы [ 13 ]

11 голосов
/ 24 августа 2009

Почему бы просто не использовать TryParse()?

public int doSomeWork(string stringValue)
{
    int value;
    int.TryParse(stringValue, out value);

    return value;
}

Приведенный выше код вернет 0, если значение не является действительным числом.

Так что, на мой взгляд, мой пример наиболее читабелен. Я пытаюсь разобрать int и вернуть его. Нет оператора объединения и не используются строковые методы. Этот метод также обрабатывает исключения, которые могут быть сгенерированы при разборе (если вы НЕ ХОТИТЕ исключений ...).

5 голосов
/ 24 августа 2009

Лично я бы пошел на исправленную версию ваших боссов - возможно, с еще большим количеством проверок на нее - если строка пуста, ваша, как вы говорите, сгенерирует исключение, поскольку "" не является хорошо отформатированным числом ?? только проверяет на ноль.

Что-то вроде:

public int doSomeWork(string value) {
  int someValue = 0;

  if (!string.IsNullOrEmpty(value)) {
    Int.TryParse(value, out someValue);
  }
}

Что решает проблему, когда значение равно «Сорок два».

3 голосов
/ 24 августа 2009

Я думаю, что ваш лучший вариант - делать то, что говорит ваш босс, этот не стоит! Тем не менее, добавьте несколько пробелов вокруг вашего, и мне это нравится больше.

int someValue = int.Parse(value ?? "0");
2 голосов
/ 24 августа 2009

Мой рефакторинг будет выглядеть так

public int doSomeWork(string value)
{
   int result = 0; //default?

   if(string.IsNullOrEmpty(value))
   {
      result = 0;
   }
   else
   {
      result = int.Parse(value); //you could also consider using TryParse(...) if your string could possibly also be different from a number.
   }

   //do some calculations upon "result"


   return result;
}

В настоящее время я читаю книгу Мартина Фаулерса по рефакторингу (хотел прочитать ее уже в течение более длительного времени), и это то, что я обычно предпочитаю, и я обнаружил, что это также часто рекомендуемый "шаблон" в кн.

2 голосов
/ 24 августа 2009

Зачем анализировать строку "0", чтобы получить целочисленное значение 0? Я определенно предпочитаю это:

public int doSomeWork(string value) {
   int someValue;
   if (String.IsNullOrEmpty(value)) {
      someValue = 0;
   } else {
      someValue = Int32.Parse(value);
   }
}
2 голосов
/ 24 августа 2009

Я определенно предпочитаю нулевой оператор слияния (??), а не ряд операторов if. Особенно, когда вам нужно объединить более одного значения, операторный подход намного удобнее для чтения. Это влияет на другие новые возможности C #, такие как лямбда-выражения, синтаксис LINQ и т. Д. Чем меньше кода, чтобы запутать фактический код, тем более ясным должно быть / должно быть намерение.

1 голос
/ 24 августа 2009

На самом деле вы можете рефакторинг до

значение переменной = 0;
int.TryParse (yourString, out value);

в любом случае у вас всегда есть действительное целое число (если это цель)

1 голос
/ 24 августа 2009

Ваш первый фрагмент только проверит, если value == null, но фрагмент секунд проверяет, если value == string.Empty || value == null. Я не знаю, каковы требования вашего метода, но эти два фрагмента сделают разные вещи.

1 голос
/ 24 августа 2009

Другое решение -

int someValue = string.IsNullOrEmpty (значение)? 0: int.Parse (значение);

1 голос
/ 24 августа 2009

эти два варианта не эквивалентны. Часть из ошибки во втором фрагменте (она должна читать if(string.IsNullOrEmpty(value)), она будет обрабатывать два случая, нулевые и пустые строки, тогда как оператор ?? обрабатывает только нули.

Отчасти это стало более читабельным. Я на стороне твоего босса.

...