可能是一个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
?
答案 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。
一些典型的空检查地点是:
NullReferenceException
。在调用方法之前,对要传递的变量进行空检查。