Почему я не могу проверить нулевую ссылку на строку подключения?

2

Вероятно, вопрос №№ №, но не пламени. Я пытался это сделать:

if (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null)
{
    // ...
}

Но я продолжал получать System.NullReferenceException. Я думал, так как он возвращает строку, которую я мог бы просто проверить на null и двигаться дальше. Мне потребовалось некоторое время, чтобы найти правильный способ сделать это:

ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"];
if (cs != null)
{
    this.Connection.ConnectionString = cs.ConnectionString;
}

Итак, в других случаях, например, для проверки объекта Session для некоторого значения я сделал бы проверку для null следующим образом:

if (Session["EmployeeID"] != null)
{
    _EmployeeID = System.Convert.ToInt32(Session["EmployeeID"]);
}

Итак, я просто хотел узнать, как вы знаете, когда вы можете или не можете сделать чек на null?

Теги:
null
nullreferenceexception
connection-string

4 ответа

4
Лучший ответ

Исключительное исключение ссылки в родительском объекте (ConfigurationManager.ConnectionStrings [ "PrimaryConnectionString" ]). Как только вы также проверите его, вы в порядке.

попробуйте следующее:

if ((ConfigurationManager.ConnectionStrings["PrimaryConnectionString"] != null)
&& (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null))
  { etc etc }

Обратите внимание, что если вы используете из него больше методов, было бы полезно отделить эти проверки.

  • 0
    Если индексатор в ConnectionStrings возвращает null когда элемент отсутствует, это довольно несовместимо со Dictionary , не так ли? Это должно бросить в этом случае.
11

Ваша проблема заключалась в том, что вы проверяли:

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]
        .ConnectionString

для нулевого указателя.

Фактически,

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]

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

null.ConnectionString

что является проблематичным.

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

  • 0
    Сначала я увидел ответ Иосипа и увидел ошибку в своем мышлении, поэтому пометил его как ответ, прежде чем увидел эти дополнительные ответы. Мне нравится ваш ответ, потому что он более понятен при разыменовании. Однако, так как у вас больше представителей, вы знаете, что делать, я придерживаюсь своей первоначальной оценки.
  • 0
    Это нормально, @Breadtruck. Чтобы превзойти акцепт, требуется всего два (20), и, честно говоря, большая часть моего повторения происходит от постепенных ответов, о которых я забыл несколько месяцев назад :-) В какой-то момент этот представитель становится скучным и Истинное намерение SO достигается (давая наилучшие возможные ответы ради них самих). В любом случае, шансы на то, что я попаду в этот первый столбец на странице пользователей, уменьшатся, поскольку у меня также есть настоящая жизнь (жена / дети / собака / и т. Д.). Вероятность того, что я поймаю Скита, равна нулю, если только он не перенес серьезное изнурительное заболевание (надеюсь, нет).
Показать ещё 1 комментарий
4

Ваш первый тест проверяет, является ли строка подключения в ConnectionStringSettings нулевой. Второй тест проверяет, является ли ссылка ConnectionStringSettings нулевой. Это разница между:

if (person.Name == null)

и

if (person == null)

Первый будет биться, если person - null; второй не будет отображаться, если person.Name равно null. Если вы хотите проверить оба варианта, вам необходимо:

if (person == null || person.Name == null)

Некоторые языки (например, Groovy) имеют нуль-безопасный оператор разыменования, поэтому вы можете сделать:

var x = Expr1?.Expr2?.Expr3?.Expr4;

Это упрощает этот вид теста, если вы хотите проверить, является ли какая-либо часть потенциально длинного выражения нулевым. К сожалению, у С# этого нет: (

  • 0
    Было бы здорово, если бы вы упомянули пример или два языка с этим нуль-безопасным оператором, мне любопытно! =)
  • 0
    @ Скит ... У меня был первый прицел Скита;)
Показать ещё 4 комментария
3

Итак, я просто хотел узнать, как вы знать, когда вы можете или не можете проверить для null?

Вы можете проверить нуль в любое удобное для вас время (за исключением типов значений, которые не могут быть nullable, которые не могут быть нулевыми).

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

Несколько типичных мест для нулевой проверки:

  • Вы получаете объект, переданный вам в качестве параметров в функции, которую вы пишете. Проведите нулевую проверку параметра перед его использованием.
  • Вы вызываете метод (или выбираете значение свойства), возвращая объект, который хотите использовать. Сделайте нулевую проверку этого возвращаемого значения перед его использованием.
  • Вы передаете объект методу, где он документирован, что он будет бросать NullReferenceException, если параметр имеет значение null. Сделайте нулевую проверку переменной, которую вы хотите передать, перед вызовом метода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню