值类型的 NullReferenceException
NullReferenceException on value type
在我的代码中,我有一个 int 类型的变量。在初始化它之后,我立即收到一个 NullReferenceException。我很困惑为什么会这样,实际上这怎么可能。
代码如下:
int lookupValue = 0;
if (0 == lookupValue)
这是调试器屏幕。 lookupValue 的值实际上是 0。
您的代码没有错误。无论如何试试这个...
if (lookupValue.CompareTo(0) == 0)
调试器将错误行显示为异常源。有时确实会发生这种情况,您需要留意周围的代码和堆栈跟踪。
由于您使用的是 Web 应用程序,调试信息也很可能与代码不同步。重建整个项目可能会有所帮助,除非您的依赖关系安排不当。
查看比较之前和下面的代码(Session
是否为空?Session.UserId
是否为空?SqlCommands.LookupInsertCommand
是否抛出 NullReferenceException
?您可以使用快速监视来检查代码片段并找到导致 NullReferenceException
.
的代码
作为旁注,尽量不要将其他语言的做法带到 C# 中。初始化局部变量 当你实际上有一个合理的值来初始化它们时 - 别担心,编译器不会允许你编译代码读取尚未分配的变量。当您只是分配一个默认值时,您将失去对代码的一些健全性检查。另外,不要比较constant == variable
。在 C# 中没有理由这样做,因为你不能不小心键入 variable = constant
- 它不会编译(唯一的例外是 bool
类型,但你不应该将其与常量进行比较无论如何 - 只需 if (boolValue)
或 if (!boolValue)
)。它只会让代码更难阅读和理解。
编辑:
如果您知道自己在寻找什么,那么这种情况尤其明显。你看,if (0 == lookupValue)
不存在于编译后的二进制文件中的任何地方——编译器可以安全地忽略它,因为 lookupValue
将 总是 是 0
.通常,调试信息会说明这一点,但即使没有像整行代码缺失那样严重的情况(在您的情况下,可能不止一行),缺失一行也很常见。
由于您正在使用 ASP.NET 应用程序,部分代码实际上并未由 Visual Studio 编译 - 它是在您发出请求时编译的。要生成正确的调试信息,您还必须在 web.config
(Compilation element) 中设置 <compilation debug="true" />
。
在我的代码中,我有一个 int 类型的变量。在初始化它之后,我立即收到一个 NullReferenceException。我很困惑为什么会这样,实际上这怎么可能。
代码如下:
int lookupValue = 0;
if (0 == lookupValue)
这是调试器屏幕。 lookupValue 的值实际上是 0。
您的代码没有错误。无论如何试试这个...
if (lookupValue.CompareTo(0) == 0)
调试器将错误行显示为异常源。有时确实会发生这种情况,您需要留意周围的代码和堆栈跟踪。
由于您使用的是 Web 应用程序,调试信息也很可能与代码不同步。重建整个项目可能会有所帮助,除非您的依赖关系安排不当。
查看比较之前和下面的代码(Session
是否为空?Session.UserId
是否为空?SqlCommands.LookupInsertCommand
是否抛出 NullReferenceException
?您可以使用快速监视来检查代码片段并找到导致 NullReferenceException
.
作为旁注,尽量不要将其他语言的做法带到 C# 中。初始化局部变量 当你实际上有一个合理的值来初始化它们时 - 别担心,编译器不会允许你编译代码读取尚未分配的变量。当您只是分配一个默认值时,您将失去对代码的一些健全性检查。另外,不要比较constant == variable
。在 C# 中没有理由这样做,因为你不能不小心键入 variable = constant
- 它不会编译(唯一的例外是 bool
类型,但你不应该将其与常量进行比较无论如何 - 只需 if (boolValue)
或 if (!boolValue)
)。它只会让代码更难阅读和理解。
编辑:
如果您知道自己在寻找什么,那么这种情况尤其明显。你看,if (0 == lookupValue)
不存在于编译后的二进制文件中的任何地方——编译器可以安全地忽略它,因为 lookupValue
将 总是 是 0
.通常,调试信息会说明这一点,但即使没有像整行代码缺失那样严重的情况(在您的情况下,可能不止一行),缺失一行也很常见。
由于您正在使用 ASP.NET 应用程序,部分代码实际上并未由 Visual Studio 编译 - 它是在您发出请求时编译的。要生成正确的调试信息,您还必须在 web.config
(Compilation element) 中设置 <compilation debug="true" />
。