【问题标题】:Why is this null check incurring a null dereference error?为什么这个空检查会导致空取消引用错误?
【发布时间】:2018-03-19 23:52:24
【问题描述】:

所以基本上我想检查我的 C# 应用程序中是否设置了设置。代码在这里

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

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

编辑:为了减轻一些混乱。太好了,Default 实际上是 Settings.Default,此外,我实际上是在尝试在 Settings() 构造函数中访问它。所以,很明显,在它被初始化之前。哎呀。 “完整”-er 代码如下。

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
    {

    }
}

【问题讨论】:

  • 它的Settings.Default。我试图在构造函数中访问它,这是一个愚蠢的想法。

标签: c# .net


【解决方案1】:

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

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

【讨论】:

  • Default 真的是Settings.Default。当我这样做时它仍然崩溃 - 哦,我想通了。准备编辑主帖。
  • Default?["StudentAccountTypeDefault"] == null 用于更高版本的 C#
  • @phuzi:确实如此,虽然我认为我更喜欢我的答案的可读性,但这当然只是我的看法
【解决方案2】:

Default是一个变量,所以如果为null,访问索引器["StudentAccountTypeDefault"]会抛出空引用异常。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多