нулевое исключение со списками в c # - PullRequest
0 голосов
/ 08 ноября 2010

эй, я пытаюсь работать с общим списком в C # и по какой-то причине после выделения памяти для списка я получаю unhandeledNullException.

 //edit

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

 private List<GeoInfo> GEOINFOS { get; set; } // edit i forgot to change it back 
// but i want to have my geoinfos private and my properties public

Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Вы сделали свойства частными. Если вы хотите, чтобы они были публичными, попробуйте:

public List<GeoInfo> GeoInfos { get; set; }

Автоматически реализованное значение, которое хранится локально в объекте, будет частным; но сами свойства являются общедоступными.

Потому что то, что вы объявляете, есть средства доступа к собственности.

Если вы хотите написать все в явном виде, вы можете сделать это старым способом до 3.0

private List<GeoInfo> geoInfos = new List<GeoInfo>;
public List<GeoInfo> GeoInfos {
  get { return geoInfos; }
  set { geoInfos = value; }
}

Это все еще зависит от инициализации geoInfos где-то (как конструктор) - или nullPointerException вернется.

Вы можете выполнить ленивую оценку прямо в геттере:

private List<GeoInfo> geoInfos = new List<GeoInfo>;
public List<GeoInfo> GeoInfos {
  get { if (geoInfos == null) {
          geoInfos = new List<GeoInfo>;
        } 
        return geoInfos; 
      }
  set { geoInfos = value; }
}

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

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

1 голос
/ 08 ноября 2010

Если вы хотите, чтобы недвижимость была частной, используйте

private List<GeoInfo> GEOINFOS { get; set; }

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

Вероятно, проблема с нулевой ссылкой связана с не инициализацией базовой переменной свойства. Это не делается автоматически, поэтому

public MyClass()
{
    GEOINFOS = new List<GeoInfo>();
}

Еще одна вещь: ваше соглашение об именах для свойства странно для C #. Как насчет того, чтобы все было согласованно и петь GeoInfos?

...