В настоящее время я работаю над классом, который предоставляет внутренний список через свойство. Список может быть изменен. Проблема заключается в том, что записи во внутреннем списке могут быть установлены в значение null извне класса.Чья ошибка - исключение NullReferenceException?
Мой код на самом деле выглядит следующим образом:
class ClassWithList
{
List<object> _list = new List<object>();
// get accessor, which however returns the reference to the list,
// therefore the list can be modified (this is intended)
public List<object> Data
{
get
{
return _list;
}
}
private void doSomeWorkWithTheList()
{
foreach(object obj in _list)
// do some work with the objects in the list without checking for null.
}
}
Так что теперь в doSomeWorkWithTheList() я всегда мог проверить, является ли нулевой текущий элемент списка или я просто не мог предполагаю, что человек, использующий этот класс не есть отличная идея установить записи в null.
Итак, в конце концов, вопросы заканчиваются: чья ошибка является исключением NullReferenceException в этом случае? Является ли это ошибкой разработчика класса, не проверяя все на нуль (что сделало бы код вообще - не только в этом классе - более сложным), или это ошибка пользователя этого класса, поскольку установка записи List в значение null doesn ' действительно ли смысл? Я бы обычно не проверял значения для null, за исключением некоторых действительно особых случаев. Это плохой стиль или де-факто стандарт/стандарт в практике?
Я знаю, что, вероятно, нет окончательного ответа на этот вопрос, я просто не хватает опыта для такой вещи и поэтому задаюсь вопросом, что другие разработчики думают о таких случаях, и хотят услышать, что сделано в действительности о проверке null (или нет).
спасибо всем за ваши ответы! Я согласен, я должен проверить null/не предлагать возможность установить значение null, если оно не указано.Я, наконец, выбрал ответ Mant101, потому что это просто прост в реализации (подсказка: попробуйте наблюдаемый коллектив - дает больше возможностей без дополнительной работы). Другие ответы тоже были хороши, но я просто мог выбрать только один ;-) Я также посмотрю на контракты с кодом, когда у меня будет больше времени (спасибо MatthewMartin). –