为什么这个空检查会产生空的解除引用错误?

时间:2018-03-19 15:46:40

标签: c# .net

所以基本上我想检查我的C#应用​​程序中没有设置设置。这里的代码

if (Default["StudentAccountTypeDefault"] is null) // Crashes after this
{
    //
}
else
{
    //
}

似乎在空检查时崩溃了。我在那里放了一个断点,它显示Default["DefaultStudentAccountType"]只是一个空字符串。为什么它会因NullReferenceException而崩溃?我很确定这是崩溃的地方 - 如果我注释掉if语句是否按预期工作。

编辑:减轻一些困惑。 Sooooo,Default实际上是Settings.Default,为了补充这一点,我实际上是试图在Settings()构造函数中访问它。所以,在它被初始化之前,显然。哎呀。下面的“完整”代码。

public Settings() {
    // // To add event handlers for saving and changing settings, uncomment the lines below:
    //
    // this.SettingChanging += this.SettingChangingEventHandler;
    //
    // this.SettingsSaving += this.SettingsSavingEventHandler;
    //
    if (Settings.Default["DefaultStudentAccountType"] is null)
    {

    }
    else
    {

    }
}

2 个答案:

答案 0 :(得分:3)

您应该使用==而不是is进行核对,这也取决于您可能需要检查Default是否为空的数据类型。试试这个:

if(Default == null || Default["StudentAccountTypeDefault"] == null)
{
}
else
{
}

答案 1 :(得分:1)

Default是一个变量,因此如果它为null,则访问索引器["StudentAccountTypeDefault"]将抛出一个空引用异常。

如果您使用的是足够新的.NET版本,则可以使用:

if (Default?["StudentAccountTypeDefault"] is null)

(null-coalescing运算符)。否则,在使用其索引器之前,只需检查Default为null。