为什么我不能检查连接字符串上的空引用?

时间:2009-07-24 06:06:25

标签: c# asp.net null connection-string nullreferenceexception

可能是一个C#noob问题,所以不要激怒我。我试图这样做:

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

4 个答案:

答案 0 :(得分:11)

你的问题是你正在检查:

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]
        .ConnectionString

表示空指针。

实际上,

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]

为null,因此,当您尝试取消引用 来获取连接字符串时,就是当您获得异常时。实际上,你正在做的是:

null.ConnectionString

这是有问题的。

我倾向于在单个语句中避免多个解除引用层,或者在整个事物周围放置一个异常处理程序来随时捕获问题。

答案 1 :(得分:4)

您的空引用异常发生在父对象中(ConfigurationManager.ConnectionStrings [“PrimaryConnectionString”])。一旦你检查它,你没事。

试试这个:

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

请注意,如果您使用更多方法,则将这些检查分开是很有用的。

答案 2 :(得分:4)

您的第一个测试检查 ConnectionStringSettings中的连接字符串是否为空。第二个测试检查ConnectionStringSettings引用本身是否为null。这是区别:

if (person.Name == null)

if (person == null)

如果person为空,第一个将会爆炸;如果person.Name为空,则第二个不会发现。如果要同时检查两者,则需要:

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

某些语言(例如Groovy)具有空安全解除引用运算符,因此您可以这样做:

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

如果您想测试潜在长表达式的任何部分是否为null,那么这种测试会更容易。不幸的是,C#没有:(

答案 3 :(得分:3)

  

所以我只是想知道你是怎么做的   知道什么时候能够或不能检查   为空?

可以在任何你喜欢的时间检查null(除了不可为空的值类型,不能为null)。

在您希望访问对象成员的任何时候检查null,并且您不确定包含该对象的变量是否为null。

一些典型的空检查地点是:

  • 您将一个对象作为您正在编写的函数中的参数传递给您。在使用之前对参数进行空值检查。
  • 您调用一个方法(或获取属性值),返回您要使用的对象。在使用之前对该返回值进行空值检查。
  • 将对象传递给一个方法,在该方法中记录如果参数为null,它将抛出NullReferenceException。在调用方法之前,对要传递的变量进行空检查。