С# исключение объявления переменной

Предположим, что у меня есть такой код:

public string SomeMethod(int Parameter)
{
  string TheString = "";

  TheString = SomeOtherMethod(Parameter);

  return TheString;
}

Конечно, этот код эквивалентен этому:

public string SomeMethod(int Parameter)
{
  return SomeOtherMethod(Parameter);
}

Я думаю, что первая версия более читаема и что я пишу свой код, даже подумал, что я использую переменную, когда знаю, что могу ее избежать. Мой вопрос заключается в следующем: компилятор компилирует код таким же образом (т.е. такую ​​же производительность) или второй вариант действительно лучше с точки зрения производительности.

Спасибо.

Ответ 1

Я бы сказал, что первая форма менее читаема и содержит избыточный инициализатор. Зачем инициализировать переменную "", если вы собираетесь дать ей другое значение? По крайней мере, измените его на:

public string SomeMethod(int parameter)
{
  string returnValue = SomeOtherMethod(parameter);    
  return returnValue;
}

или если вы действительно хотите отделить объявление от инициализации:

public string SomeMethod(int parameter)
{
  string returnValue;
  returnValue = SomeOtherMethod(parameter);    
  return returnValue;
}

(Обратите внимание, что я также скорректировал имя, чтобы следовать соглашениям об именах .NET и дать более значимое имя локальной переменной - "TheString" не имеет никакого полезного значения.)

Вы действительно не увидите никаких проблем с производительностью при использовании локальной переменной, но я действительно рекомендую вам подумать о читаемости. В чем цель локальной переменной здесь? Вы предположительно описываете метод как: "Возвращает результат вызова SomeOtherMethod с заданным параметром" - в этот момент однострочная версия реализует именно это описание.

Ответ 2

Компилятор создаст очень похожий код для ваших двух примеров. Одна небольшая модификация заключается в том, чтобы избежать инициализации пустой строки, которую вы никогда не используете.

public string SomeMethod(int Parameter)
{
    string result;
    result = SomeOtherMethod(Parameter);
    return result;
}

Я не уверен, что переписывание кода таким образом делает его более читаемым, но это означает, что вы можете добавить точку останова и увидеть значение result до возвращения метода. Это может быть полезно при отладке.

Обратите внимание, что вы можете комбинировать первую и вторую строки и все еще получать это преимущество:

public string SomeMethod(int Parameter)
{
    string result = SomeOtherMethod(Parameter);
    return result;
}

Я думаю, что эта последняя версия хорошо читаема и легко отлаживается.

Ответ 3

Ответ уже опубликован, хотя позвольте мне дать другую попытку:

Есть 3 вещи, которые вы ищете:

Считываемость, производительность, полезность (например, отладка, ведение журнала и т.д.)

1. Читаемость несколько относительна. Что Эрик Липперт/Джон Скит находит что-то более читаемым, то же самое не будет применимо ко мне. Все больше и больше вы код, многие вещи и ваша перспектива изменится в сторону просмотра кода.

Оба варианта, которые вы дали, являются читаемыми, для меня второй - более читаемым.

2. Производительность. В первом выборе, поскольку вы можете мне знать о неизменности строки, что если вы повторно инициализируете строку, она не очистит более раннее имя (интернирование) и он создаст новую строку, и переменная укажет на нее.

Таким образом, с точки зрения производительности, инициализация переменной до нового значения (без необходимости) вызовет узкое место в производительности. Опять же, это относительно, и зависит от размера/общности приложения. Для этого вам нужно пойти со вторым вариантом. Ваш второй вариант и ответ Джона приведут к одинаковой производительности.

3. Отладка перспективы: вы хотите иметь локальную переменную, если ищете этот материал.