Вероятно, вопрос №№ №, но не пламени. Я пытался это сделать:
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
?
Исключительное исключение ссылки в родительском объекте (ConfigurationManager.ConnectionStrings [ "PrimaryConnectionString" ]). Как только вы также проверите его, вы в порядке.
попробуйте следующее:
if ((ConfigurationManager.ConnectionStrings["PrimaryConnectionString"] != null)
&& (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null))
{ etc etc }
Обратите внимание, что если вы используете из него больше методов, было бы полезно отделить эти проверки.
Ваша проблема заключалась в том, что вы проверяли:
ConfigurationManager
.ConnectionStrings["PrimaryConnectionString"]
.ConnectionString
для нулевого указателя.
Фактически,
ConfigurationManager
.ConnectionStrings["PrimaryConnectionString"]
был нулевым, так что, когда вы попытались разыменовать это, чтобы получить строку подключения, это когда вы получили исключение. Эффективно, что вы делаете:
null.ConnectionString
что является проблематичным.
Я стараюсь либо избегать многих уровней разыменования в одном утверждении, либо помещать обработчик исключений вокруг всего объекта, чтобы уловить проблемы в любой момент.
Ваш первый тест проверяет, является ли строка подключения в 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;
Это упрощает этот вид теста, если вы хотите проверить, является ли какая-либо часть потенциально длинного выражения нулевым. К сожалению, у С# этого нет: (
=)
Итак, я просто хотел узнать, как вы знать, когда вы можете или не можете проверить для null?
Вы можете проверить нуль в любое удобное для вас время (за исключением типов значений, которые не могут быть nullable, которые не могут быть нулевыми).
Вы должны проверить значение null в любое время, когда хотите получить доступ к членам объекта, и не уверены, что переменная, содержащая объект, не является нулевой.
Несколько типичных мест для нулевой проверки:
NullReferenceException
, если параметр имеет значение null. Сделайте нулевую проверку переменной, которую вы хотите передать, перед вызовом метода.
ConnectionStrings
возвращаетnull
когда элемент отсутствует, это довольно несовместимо соDictionary
, не так ли? Это должно бросить в этом случае.