可能出现空引用异常

4

Resharper正在显示“可能的System.NullReferenceException”警告。然而我看不出我怎么会得到一个。

public class PlaceController : PlanningControllerBase
{
    [Authorize]
    public ActionResult StartStop(int id)
    {
        if (Request != null && Request.Cookies != null && Request.Cookies["place"] != null)
        {
            if (Request.Cookies["place"].Value != null)//Possible NullReferenceException?
            {
                string placeInformation = Request.Cookies["place"].Value;//Possible NullReferenceException?
                //...
            }
        }
    }
}

如果我检查了所有字段,为什么会出现NullReference?使用以下代码不会显示警告:
Request.Cookies[0];//Index instead of name

编辑:更新代码。


你想在 Request.Cookies["place"].Value 为 null 的情况下设置变量 placeInformation,这是有原因的还是失误了? - Çağdaş Tekin
3个回答

7

我猜测检查器没有检查传递给CookieCollection索引器的字符串值是否每次相同。如果您重构代码为:

if (Request != null && Request.Cookies != null) 
{
    var place = Request.Cookies["place"];
    if (place != null && place.Value == null) 
    { 
        string placeInformation = place.Value;
    } 
}

可能会起作用。


4

您不需要听取每个警告。 Request 对象和 Cookies 对象永远不会为 null,因此这就是您所需的全部内容。

var placeCookie = Request.Cookies["place"]; 
if (placeCookie != null)
{
    string placeInformation = placeCookie.Value;
}

确实,只需编写“HttpCookie cookie = Request.Cookies [“place”];”即可正常工作并且不显示任何警告。 - Carra
@Carra - 只是一句旁白,我认为在日常词汇中使用“indeed”确实很棒。 - ChaosPandion
英语不是我的母语。我本意是使用“是的,…”。 - Carra
@Cara - 我并没有暗示你的英语有误。我只是想说,出于某种奇怪的原因,我喜欢“indeed”这个词。 - ChaosPandion

0

错误,你不想要 Request.Cookies["place"].Value != null ,现在你只会将 placeInformation 设置为 null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接