C# 当变量不为null时,为什么显示NullReferenceException?

C# 当变量不为null时,为什么显示NullReferenceException?,c#,.net-4.0,visual-studio-2012,nullreferenceexception,visual-studio-debugging,C#,.net 4.0,Visual Studio 2012,Nullreferenceexception,Visual Studio Debugging,为什么VS 2012将类型变量显示为NullReferenceException,而它同时显示为value=“Retailer” 我有一个新生儿,我的睡眠有限,所以如果我错过了一些明显的东西,我道歉。LoggedInUser.Employer对象已经实例化,该行在1/2的时间内运行良好。但随后它开始破裂。不确定这是否有帮助-需要睡眠 private string _type; public string Type { get { return _type; }

为什么VS 2012将类型变量显示为NullReferenceException,而它同时显示为
value=“Retailer”

我有一个新生儿,我的睡眠有限,所以如果我错过了一些明显的东西,我道歉。LoggedInUser.Employer对象已经实例化,该行在1/2的时间内运行良好。但随后它开始破裂。不确定这是否有帮助-需要睡眠

 private string _type;
    public string Type
    {
        get { return _type; }
        set
        {
            if (value != null)
            {
                TypeEnum = (Constants.BusinessType)Enum.Parse(typeof(Constants.BusinessType), value, true);
                _type = value;
            }
        }
    }
我开始怀疑这是否是一个跨线程的问题


我猜您在某处声明了一个名为“String”的字段-尝试使用小写的“String.IsNullOrEmpty”或“System.String.IsNullOrEmpty”作为一个…

String.IsNullOrEmpty不会在字符串上引发此异常,即使它为null,因此类型属性不是问题。LoggedInUser在前面使用了2行,没有错误,因此将雇主属性作为罪魁祸首(除非字符串不是内置字符串)

您可以在其上添加null检查以确认:

if (LoggedInUser.Employer != null) 
{
    if (String.IsNullOrEmpty(LoggedInUser.Employer.Type))
    {
        ...  
    }
}
else
{
    // debug output
}

假设雇主为空,您需要在此处提供该属性定义。因为您只在多个用户登录时才看到这一点,所以我怀疑静态声明不应该出现在某个地方。

负责存储
HttpContext的ASP.NET
ExecutionContext
。当前的
实例自然不会“流”到其他线程。从错误堆栈跟踪判断,您使用的是ASP.NET MVC,这是一个抽象使用
HttpContext
的框架。您可能来自WebForms背景,直接使用WebForms很常见

行绪 提供了比我能合理深入的更多细节。但与您的情况最相关的几点是:

ExecutionContext是关于“环境”信息的,这意味着它存储与当前环境或您运行的“环境”相关的数据

此“环境”信息正在
HttpContext.Current
及其各种属性(包括
会话

“这意味着我们用来控制执行细节的环境上下文不再可行,因为TLS不会在这些异步点之间“流动”

TLS是线程本地存储(
HttpContext.Current
等)。简言之,异步=可能丢失
HttpContext.Current

MVC方式 还记得我说过MVC主要是抽象出HttpContext吗

会话
正在进行中。(很抱歉,到目前为止,我还没有在async controller操作中对此进行测试,因此无法验证它是否适合您的需要,或者您是否需要额外的工作才能使其配合。)

请求

用户
处于

还有其他的

会话替代方案? 你考虑过其他选择吗?你不必看得太远,就会发现一些文章认为Session+ASP.NETMVC是个坏主意。我不打算对是否是“坏事”这样笼统的问题进行权衡,但看看你的例子,在我看来,你处理的是用户配置文件数据,而不是“会话”数据

会话并不是缓存用户配置文件信息的正确位置。就这一点而言,缓存它是否合适?用户配置文件能否在会话期间更改?如果他们自己更改了,您会重置会话吗?如果一个单独的管理员用户在登录时更改了他们的配置文件,该怎么办


探索替代方案超出了本问题的范围,但请注意,您可能试图在此处解决错误的问题。

您能提供每个相关部分的代码吗?例如:
Employer
class'
Type
属性?您可能没有正确初始化
LoggedinUser
,但是如果没有提供相关代码,您就无法判断。。如果您在if语句中强制转换类型会有帮助吗?
if(string.IsNullOrEmpty((string)LoggedInUser.Employer.type)){}
您能给我们看一些实际的代码而不仅仅是模糊的屏幕截图吗?我们的调试能力与您给我们的相比非常有限。@JeffBorden-粘贴stacktrace!“我开始怀疑这是否是一个跨线程问题”——这将解释为什么调试器在查看变量时没有问题。LoggedInUser及其属性是如何设置的?它完全依赖于HttpContext吗?如果这是他的错误,那么它就不会编译,而不是抛出一个NRE。@Servy它会编译,因为C#编译器会判断你是在谈论类型还是变量。但是它仍然不会抛出一个NRE,除非该字段有一个非常奇怪的类型。@CodesInChaos No,在C#中,对类型的实例调用静态方法。它将生成此错误:
“Member”string.IsNullOrEmpty(string)”无法通过实例引用访问;请使用类型名称对其进行限定“
这与JAVA不同,在JAVA中,从该类型的实例调用静态方法是有效的。@Servy尝试一下,它可以工作。可能是因为(只要您有适当的
using
s)
String
同时引用类型和字段。只有在尝试对未被称为
string
@codesin混沌的字符串字段调用
IsNullOrEmpty
时才会出现该错误,这样它才能工作,并且无论是否有名为
string
的变量,因为它无法屏蔽它。重点仍然是,这不是OP的问题。谢谢你编写了这个深思熟虑的答案。您的假设是正确的,我有WebForms背景,这是我第一次尝试MVC应用程序。LoggedInUser类存储在会话中,因为它的属性在应用程序的整个生命周期中经常被访问。我为什么要这样做?首先,因为这是我所知道的(不是一个很好的理由,但它是一个理由)。秒