检查Null异常的正确方法是什么?

时间:2008-10-03 02:41:45

标签: c# asp.net

哪个代码最正确?

if (HttpContext.Current.Response.Cookies[authCookieName] != null) {
    HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value";
}

if (HttpContext.Current != null)
    if (HttpContext.Current.Response != null)
        if (HttpContext.Current.Response.Cookies != null)
            if (HttpContext.Current.Response.Cookies[authCookieName] != null)
                HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value";

7 个答案:

答案 0 :(得分:19)

如果HttpContext,HttpContext.Current,HttpContext.Current.Response或Http.Current.Response.Cookies中的任何一个为空,那么您已经遇到了麻烦。让异常发生并修复您的Web服务器。

答案 1 :(得分:4)

可以尝试:

if(HttpContext.Current != null && 
   HttpContext.Current.Response != null && 
   HttpContext.Current.Response.Cookies != null && 
   HttpContext.Current.Response.Cookies[authCookieName] != null) 
{
    // do your thing
}

答案 2 :(得分:4)

两者都很好。假设您已经检查了所有需要先检查的其他内容。 E.g:

private bool CheckSuspendersAndBelt()
{
    try
    {
        //ensure that true is true...
        if (true == true)
        {
            //...and that false is false...
            if (false == false)
            {
                //...and that true and false are not equal...
                if (false != true)
                {
                    //don't proceed if we don't have at least one processor
                    if (System.Environment.ProcessorCount > 0)
                    {
                        //and if there is no system directory then something is wrong
                        if (System.Environment.SystemDirectory != null)
                        {
                            //hopefully the code is running under some version of the CLR...
                            if (System.Environment.Version != null)
                            {
                                //we don't want to proceed if we're not in a process...
                                if (System.Diagnostics.Process.GetCurrentProcess() != null)
                                {
                                    //and code running without a thread would not be good...
                                    if (System.Threading.Thread.CurrentThread != null)
                                    {
                                        //finally, make sure instantiating an object really results in an object...
                                        if (typeof(System.Object) == (new System.Object()).GetType())
                                        {
                                            //good to go
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
    catch
    {
        return false;
    }
}

(抱歉,忍不住...... :))

答案 3 :(得分:1)

HttpContext.Current.Response.Cookies永远不会为null。唯一可以导致null的是,如果您期望的cookie不存在,那么第一个是正确的。如果您不接受Web请求,则HttpContext.Current将为null:)

答案 4 :(得分:1)

你给出的第一个例子绰绰有余。如上所述,如果任何其他对象为null,则表明ASP.NET存在问题。

if (HttpContext.Current.Response.Cookies[authCookieName] != null) {
    HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value";
}

但是,您应该创建一些通用函数,例如 SetCookie GetCookie GetQueryString ,而不是乱丢您的代码。 GetForm 等,它接受名称和值(对于Set函数)作为参数,处理空检查,并返回值或空字符串(对于Get函数)。这将使您的代码更易于维护和改进,如果您决定将来使用Cookie之外的其他东西来存储/检索选项,您只需更改功能。

答案 5 :(得分:0)

两者都不是更正确,但我会避免第二种情况,因为深度嵌套的条件往往难以理解和维护。

如果您希望获得空指针异常,请使用第一个。如果你想以其他方式或静默处理空值,请使用第二个(或第二个的重构版本)。

答案 6 :(得分:0)

如果您认为CurrentResponseCookiesCookies[authCookieName]可能是null,并且您有合理的事情可做如果他们中的任何一个,那么后者是要走的路。如果机会很低,和/或如果中间体为空则无法做任何事情,请选择前者,因为它更简洁 - 如果使用扩展示例,最好的办法是获得更好的记录。