2014-10-03 3 views
1

Я программирую на 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"); 
    } 
} 

ответ

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

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

var result = ""; 
+1

Плохая практика. Использовать var result = String.Empty; –

+0

@ DanHunex: Нет, спасибо, объясните, почему вы считаете это «плохой практикой». В течение некоторого времени из-за прерывания строки не было какой-либо фактической семантической разницы. Вам просто нравится набирать текст? –

+0

Почему вы думаете, что добавлено String.IsNullOrWhitespace? Потому что люди иногда пишут «» вместо «». Но String.Empty всегда гарантирует, что он пуст –

0

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

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

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