ОШИБКА: использование неназначенной локальной переменной (для строкового массива)

Я читаю строки подключения из моего файла App.config, и для этого у меня есть следующий код.

try
 {
    string[] dbnames;
    int counter = 0;
    foreach (ConnectionStringSettings connSettings in ConfigurationManager.ConnectionStrings) 
    {
        dbnames[counter] = connSettings.Name;
        counter++;
    }
    return dbnames;
 }
 catch
 {
    throw;
 }

этот код дает мне ошибку использования неназначенной локальной переменной для имен баз данных. у меня будет несколько строк подключения в моем App.config. Они могут быть никакими, 1, 2 и так далее. В зависимости от потребностей. поэтому я не могу статически назначить размер имени базы данных. Потому что может быть сценарий, если они превышают значение заданного размера. например. если я назначу ему размер 5, и что, если я получу 6-ю строку подключения. и если у меня есть 1, то оставшиеся 4 будут пустой тратой памяти.

Если я ошибаюсь, дайте мне знать.

Спасибо.


person booota    schedule 27.01.2011    source источник
comment
Исправьте это с помощью: string[] dbnames = null; Запустите код, затем поймите, почему он не работает.   -  person leppie    schedule 27.01.2011
comment
@leppie: Умно, я поставил +1. Также можно сказать: неинициализированная переменная не имеет инициализатора. \о/   -  person Romain    schedule 27.01.2011
comment
да, я попробовал null, а затем перешел к разделу исключения «поймать»   -  person booota    schedule 27.01.2011
comment
Хорошо, первый шаг — понять корень проблемы. Теперь следуйте ответам ниже, чтобы решить остальную часть проблемы :)   -  person leppie    schedule 27.01.2011
comment
Если у меня есть 3 строки подключения в моем теге appSettings, как я могу определить, какая из них используется по умолчанию (очевидно, когда я выберу одну из них по умолчанию)?   -  person booota    schedule 28.01.2011


Ответы (5)


Используйте это при инициализации массива.

 string[] dbnames = new string[ConfigurationManager.ConnectionStrings.Count];

ИЛИ используйте List<string>

person Adeel    schedule 27.01.2011
comment
Как я буду читать файл app.config, который содержит? [code]‹?xml version=1.0 encoding=utf-8 ?› ‹configuration› ‹connectionStrings› ‹add name=Local Area Network connectionString=server=localhost;ID пользователя=root;database=myportfolio;время ожидания подключения=30 /› ‹/connectionStrings› ‹/configuration› [/code] - person booota; 27.01.2011
comment
@booota вы уже используете класс ConfigurationManager. При этом вы можете прочитать другой раздел в файле конфигурации. например в цикле foreach вы можете использовать этот код.ConfigurationManager.ConnectionStrings[i].ConnectionString - person Adeel; 27.01.2011
comment
но что я даю мне некоторую информацию mdb, когда я печатаю вывод. Но я подключаю его к mysql, используя соединитель mysql. и моя строка подключения написана выше. как вы можете видеть. - person booota; 27.01.2011

Вы не можете динамически изменять размер System.Array.

К счастью, причин для этого нет. Вместо этого используйте другой тип коллекции, например List<T>. (Убедитесь, что вы добавили объявление using для пространства имен System.Collections.Generic!)

Как и массив, List<T> позволяет вам получить доступ к элементам в списке по индексу, но он также динамически изменяется во время выполнения, что соответствует требованиям вашего вопроса. И, конечно же, поскольку это общий метод, у него есть дополнительное преимущество (по сравнению с некоторыми другими вашими вариантами) в том, что он строго типизирован. Поскольку вы работаете с типами string, вы должны использовать List<string>.

EDIT: Нет абсолютно никакой необходимости в этом пустом блоке try/catch. Зачем перехватывать исключение, если вы просто собираетесь немедленно его восстановить? Просто позвольте этому пузыриться. В общем, вы не должны перехватывать исключения, если и только если вы не можете исправить их непосредственную причину.

person Cody Gray    schedule 27.01.2011
comment
+1 boota также даже не инициализировала массив; он просто заявил об этом. И к вашему сведению, на случай, если booota нужно, чтобы тип возвращаемого значения был string[], List‹T› также имеет метод ToArray() — List‹string› dbnames; dbnames.ToArray(); - person bitxwise; 27.01.2011

Вы объявляете dbnames массивом строк, но не определяете его размер.

Вам понадобится что-то вроде:

string[] dbames = new string[4];

где "4" - длина вашего массива.

Однако, если вам нужна переменная длина, вы должны использовать List<string>. В этом случае вы можете добавить к нему по мере необходимости.

person ChrisF    schedule 27.01.2011

Как уже говорили другие, вы можете просто использовать файл List<string>. Я бы использовал LINQ для всего этого, если вы используете .NET 3.5 или выше:

return ConfigurationManager.ConnectionStrings
                           .Cast<ConnectionStringSettings>()
                           .Select(setting => setting.Name)
                           .ToArray(); // Or ToList
  • Нет необходимости в цикле foreach (в вашем коде - очевидно, он где-то есть :)
  • Вы можете легко решить, следует ли возвращать список, массив или просто IEnumerable<string>
  • Не нужно пытаться/поймать
person Jon Skeet    schedule 27.01.2011

объявите его после класса, например

я тоже пишу код и всегда сталкивался с этой проблемой

   public class ABC{
string[] array;
ABC()
{
}
//your_function_logics
}
person Umer Khan Yousefzai    schedule 28.08.2019