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

时间:2013-02-18 01:29:32

标签: c# .net-4.0 visual-studio-2012 nullreferenceexception visual-studio-debugging

NRE

为什么VS 2012将Type变量显示为NullReferenceException,同时还显示它是value = "Retailer"

enter image description here

我有一个新生儿,我正在努力限制睡眠,所以如果我遗漏了一些明显的东西,我会道歉。已经实例化了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;
            }
        }
    }

enter image description here 我开始怀疑这是否是一个跨线程的问题......

enter image description here

3 个答案:

答案 0 :(得分:2)

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

的SynchronizationContext

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

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

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

“这意味着我们依赖于控制执行细节的环境上下文不再可行,因为TLS不会”流过“这些异步点。” < / p>

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

MVC方式

还记得我说MVC主要是摘录HttpContext吗?

Session位于Controller.Session。 (我很遗憾地说,我还没有在异步控制器操作中对此进行测试,因此无法验证它是否适合您的需求,或者您是否需要额外的工作才能使其合作。)

Request位于Controller.Request

User位于Controller.User

还有其他人...... check them out

会话替代方案?

你考虑过其他选择吗?您不必远远地找到建议Session + ASP.NET MVC是一个坏主意的文章。我不打算对一些事情进行权衡,不管它是否是“坏事”,但看看你的例子,在我看来你处理的是用户档案数据,而不是“会话”数据。

会话实际上不是缓存用户个人资料信息的正确位置。就此而言,是否适合缓存它? 会话期间,用户个人资料是否可以更改?如果他们自己更改了,你会重置会话吗?如果单独的管理员用户在登录时更改了他们的个人资料,该怎么办?

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

答案 1 :(得分:1)

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

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

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

假设Employer为null,您需要在此处提供该属性定义。因为你只有在多个用户登录时才会看到这个,所以我怀疑它不应该是某个地方的静态声明。

答案 2 :(得分:0)

我的猜测是你在某个地方宣称一个名为&#34; String&#34; - 尝试使用小写&#34; string.IsNullOrEmpty&#34;或&#34; System.String.IsNullOrEmpty&#34;一个......