哪个代码最正确?
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";
答案 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)
如果您认为Current
,Response
,Cookies
或Cookies[authCookieName]
可能是null
,并且您有合理的事情可做如果他们中的任何一个,那么后者是要走的路。如果机会很低,和/或如果中间体为空则无法做任何事情,请选择前者,因为它更简洁 - 如果使用扩展示例,最好的办法是获得更好的记录。