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

NRE

为什么VS 2012在显示value = "Retailer"时显示Type变量为NullReferenceException。

在这里输入图像描述

我有一个新生儿,而且我正在进行有限的睡眠,所以如果我在这里错过了一些明显的东西,我很抱歉。 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;
            }
        }
    }

在这里输入图像描述 我开始怀疑这是否是一个跨线程问题...


负责存储HttpContext.Current实例的ASP.NET ExecutionContext不会自然地“流”到其他线程。 通过你的错误堆栈跟踪来判断,你正在使用ASP.NET MVC,一个抽象出HttpContext的使用的框架。 您可能来自WebForms背景,它的直接用途很普遍?

的SynchronizationContext

本文提供了比我可以合理进行的更多细节。 一些与你的情况最相关的点是:

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

这个“环境”信息是...... HttpContext.Current及其各种属性(包括Session )。

“这意味着我们依赖控制执行细节所依赖的环境背景已不再可行,因为TLS不会”跨越“这些异步点”流动“。”

TLS是线程本地存储( HttpContext.Current等)简而言之,async =可能会丢失HttpContext.Current

MVC的方式

还记得我说过MVC大多是将HttpContext抽象掉了吗?

Session在Controller.Session中。 (我很抱歉地说,迄今为止我还没有在异步控制器操作中测试过它,所以无法验证它是否适合您的需求,或者您是否需要额外的工作才能进行配合。)

Request在Controller.Request中

User在Controller.User中

还有其他...检查出来。

会议选择?

你有没有考虑替代品? 您不必远远寻找建议Session + ASP.NET MVC是坏主意的文章。 我不会考虑某种东西是否是一件“坏事”,但看看你的例子,在我看来,你正在处理用户配置文件数据,而不是“会话”数据。

会话不是真正适合缓存用户配置文件信息的地方。 对于这个问题,缓存它是否合适? 会话期间用户配置文件是否可以更改? 如果他们自己改变它,你会重置会话吗? 如果单独的管理员用户在登录时更改了他们的个人资料会怎么样?

探索替代方案不在这个问题的范围之内,但只是要小心,你可能试图在这里解决错误的问题。


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

您可以添加一个空的检查来确认:

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

假设雇主为空,您需要在此处提供该属性定义。 因为你在多个用户登录时只能看到这个,所以我怀疑它不应该是静态声明。


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

链接地址: http://www.djcxy.com/p/11815.html

上一篇: Why is it showing NullReferenceException when the variable is not null?

下一篇: Rendering of blocks in Episerver MVC