C# LINQ NULL check



在我的表单上,如果电影在bringback列中没有日期(日期类型),我想禁用bt_rent按钮,这意味着dvd仍然过期,无法出租:

var j = (from s in db.Rentals where s.Movietitle == (string)listbox1.SelectedValue select s).FirstOrDefault();

if (j.Bringback==null)
{
    elerhetotext.Text = "The dvd is not available for renting";
    bt_rent.Enabled = false;
}
else
{
    elerhetotext.Text = "Rentable";
    bt_rent.Enabled = true;
}

我得到的错误:

用户代码未处理Nullreferenceexpection(错误位于:if(j.Ringback==null))对象引用未设置为对象

您缺少对j本身的验证。在这种情况下,似乎没有您要查找的名称的DVD,因此理想情况下,您应该验证j是否为NULL,而不是

if (j.Bringback==null)

执行以下

if (j != null || (j != null && j.Bringback==null))

因此,您正在检查DVD是否存在,如果存在,则验证的第二部分基于j本身,并且Bringback是否为null。

Variavle j是给定代码中的一种对象Rental

<pre>
var j = (from s in db.Rentals where s.Movietitle == (string)listbox1.SelectedValue select s).FirstOrDefault();
</pre>

Chek j为空或与不同

<pre>
if (j==null)
{
    elerhetotext.Text = "The dvd is not available for renting";
    bt_rent.Enabled = false;
}
else
{
    elerhetotext.Text = "Rentable";
    bt_rent.Enabled = true;
}
</pre>

异常意味着j本身就是null,因此在访问j的成员之前,您需要检查j不是null

if (j == null) {
    elerhetotext.Text = "DVD/movie does not exist";
    bt_rent.Enabled = false;
} else if (j.Bringback == null) {
    elerhetotext.Text = "The dvd is not available for renting";
    bt_rent.Enabled = false;
} else {
    elerhetotext.Text = "Rentable";
    bt_rent.Enabled = true;
}

这只是mez编写的已接受答案的补充


使用C#6.0的空条件运算符可以将代码重写为:

var j = (from s in db.Rentals
         where s.Movietitle == (string)listbox1.SelectedValue
         select s).FirstOrDefault();
// checks whether `j´ is null or `j.Bringback´ is null
if (j?.Bringback == null)
{
    elerhetotext.Text = "The dvd is not available for renting";
    bt_rent.Enabled = false;
}
else
{
    elerhetotext.Text = "Rentable";
    bt_rent.Enabled = true;
}


声明

if (j != null || (j != null && j.Bringback==null))

将被重写为

if (j?.Bringback == null)

相关内容

  • 没有找到相关文章