Вам нужно инициализировать строковую переменную внутри метода?

Я программирую на C # и все время получаю ошибку для моей строковой переменной result.

Когда я наводил курсор на строку return result, он говорит об использовании неназначенной локальной переменной.

Должен ли я присвоить результату значение перед его использованием? Почему я не получаю ту же ошибку для читателя SqlDataReader?

string searchbyLastName(string lastname)
{
    string result; 

    SqlDataReader reader;

    try
    {
        reader = myCommand.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                if (reader["LastName"].ToString() == lastname)
                {
                    result = reader.GetString(0);
                    break;
                }
            }

            return result;
        }
        else 
           return "No results found";
    }
    catch (Exception)
    {
        return("Database Error");
    }
}

person user2510809    schedule 03.10.2014    source источник


Ответы (2)


if (reader["LastName"].ToString() == lastname)

Если это не так, result не инициализируется. SqlDataReader всегда инициализируется перед использованием. Просто инициализируйте строку.

var result = "";
person Ed S.    schedule 03.10.2014
comment
Плохая практика. Используйте var result = String.Empty; - person Dan Hunex; 03.10.2014
comment
@DanHunex: Нет, спасибо, пожалуйста, объясните, почему вы считаете это плохой практикой. Некоторое время не было никакой реальной семантической разницы из-за интернирования строк. Вам просто нравится печатать? - person Ed S.; 03.10.2014
comment
Как вы думаете, почему добавлен String.IsNullOrWhitespace? Потому что люди иногда пишут вместо. Но String.Empty всегда гарантирует, что он пуст - person Dan Hunex; 03.10.2014
comment
@DanHunex: Есть? Странный. За более чем десять лет работы я ни разу не видел такой ошибки. Думаю, я останусь с "", но спасибо. PS: IsNullOrWhitespace почти наверняка не добавлен для учета опечаток при попытке инициализировать переменную пустой строкой. Он предназначен для проверки пустого input, а не неправильно инициализированных переменных. - person Ed S.; 03.10.2014
comment
Что ж, вы также можете это увидеть, но я не пытаюсь убедить вас с более чем 10-летним опытом stackoverflow.com/questions / 2905378 / string-empty-versus - person Dan Hunex; 03.10.2014
comment
@DanHunex: Ну ... вопрос, получивший наибольшее количество голосов, прямо говорит, что нет никакой разницы, но это технический ответ. Как насчет этого? stackoverflow.com/questions/263191/. Я согласен с Джоном Скитом в этом; вы придумываете проблему. Если вам это нравится, ничего страшного, я ничего не имею против, но я предпочитаю "", и я никогда не слышал, чтобы кто-то набирал " ", что привело к ошибке. Всегда. Конечно, это не значит, что этого не произошло или не произойдет, но я рискну на этот раз. - person Ed S.; 03.10.2014
comment
@DanHunex: И я не хотел сказать, что мои десять лет - это потрясающее достижение, но это определенно достаточно большой размер выборки, чтобы написать много тысяч "" - person Ed S.; 03.10.2014

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

В вашем случае reader всегда присваивается значение (reader = myCommand.ExecuteReader();), но result нет, потому что это зависит от reader["LastName"].ToString() == lastname истинности, что может никогда не произойти (даже если вы спроектировали систему так, что на самом деле вы всегда найдете совпадение - компилятор не знаю).

Итак, где-то перед тем, как вы войдете в этот цикл while, вам нужно присвоить значение. result = null было бы достаточно. Это значение также можно использовать для сигнализации о состоянии «фамилия не найдена» для вызывающего кода.

person Hans Kesting    schedule 03.10.2014