【问题标题】:C# - Access array without null exceptionC# - 无空异常访问数组
【发布时间】:2011-11-30 23:43:40
【问题描述】:

我必须通过 QueryString 数组设置这些变量:

UtmSource = HttpContext.Current.Request.QueryString["utm_source"];
UtmMedium = HttpContext.Current.Request.QueryString["utm_medium"];
UtmCreative = HttpContext.Current.Request.QueryString["utm_creative"];
UtmCampaign = HttpContext.Current.Request.QueryString["utm_campaign"];
UtmTerm = HttpContext.Current.Request.QueryString["utm_term"];
UtmContent = HttpContext.Current.Request.QueryString["utm_content"];
Tag1 = HttpContext.Current.Request.QueryString["utm_source"];
Tag2 = HttpContext.Current.Request.QueryString["m"];

查询字符串中的某些键可能会抛出空异常。

我不想将每个 var 包装在 try catch 中,也不想用 try catch 包装所有变量,因为如果第一个失败,整个变量将无效/避免。

如何安全地访问这些变量?

【问题讨论】:

  • 您可以尝试添加一个使用 QueryString 名称调用的函数并处理函数内部的 try-catch(如果失败,请将返回值设置为默认值)。

标签: c# try-catch


【解决方案1】:

我会使用 null-coalescing 操作符让它变得更简单

UtmSource = Request.QueryString["utm_source"] ?? "DefaultValue"

您可以在MSDN 阅读有关运营商的更多信息。

【讨论】:

    【解决方案2】:

    当您想安全地获取查询字符串参数的值时,使用这样的方法怎么样?

    public string getQueryStringValueOrEmpty(string key)
    {
      string result = HttpContext.Current.Request.QueryString[key];
    
      if(result == null)
      {
        result = string.Empty;
      }
    
      return result;
    }
    

    【讨论】:

      【解决方案3】:

      建议:

      UtmSource = (Request.QueryString.ContainsKey("utm_source")) ? Request.QueryString["utm_source"] : null;
      

      只有那些有效的会被设置为某个东西,其他的会被设置为null(如果它们可以为空)

      【讨论】:

        【解决方案4】:

        这是一个替代方案,它使用内置的 ParseQueryString 和 NameValueCollection 来跳过一些繁忙的工作。我也尝试使用 .IsNullOrEmpty,但我的控制台应用程序对此犹豫不决。

        Uri tempUri = new Uri("http://microsoft.com/Default.aspx?IsMonkeyBusiness=true&Name=Daniel&Test=");
        string sQuery = tempUri.Query;
        NameValueCollection qscoll = HttpUtility.ParseQueryString(sQuery);
        foreach (string s in qscoll)
            foreach (string v in qscoll.GetValues(s))
                if (!(v=="")) Console.WriteLine("{0}",v);
        Console.ReadLine();
        

        【讨论】:

          【解决方案5】:
          if (!String.IsNullOrEmpty(HttpContext.Current.Request.QueryString["utm_term"]))
                      {
                      }
          

          可以解决这个.. 或;

          编写一个扩展函数来检查对象是否为空并像使用它一样

          HttpContext.Current.Request.QueryString["utm_term"].checkNull("");
          

          并给该函数一个返回值,在这个例子中它的 "" 和空字符串..

          【讨论】:

            猜你喜欢
            • 2015-03-24
            • 2013-03-26
            • 2012-11-14
            • 1970-01-01
            • 1970-01-01
            • 2022-01-11
            • 2020-10-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多