【问题标题】:Using the conditional operator ? to check for null session variable使用条件运算符?检查空会话变量
【发布时间】:2010-10-13 12:00:18
【问题描述】:

看看这段代码:

System.Web.SessionState.HttpSessionState ss = HttpContext.Current.Session["pdfDocument"] ?? false;

        if ((Boolean)ss)
        {
            Label1.Text = (String)Session["docName"];
        }

基本上我想检查 HttpContext.Current.Session["pdfDocument"] 是否不为空,如果不强制转换为布尔值,则检查它的真假。

我试图避免嵌套 if 语句,并认为会有一种更优雅的方式来做到这一点。因此,我只对包含条件的答案感兴趣?运算符。

有什么建议吗?

【问题讨论】:

  • 这确实是完全错误的,即使有可能,它也接近于不可读和不可预测的代码。说不,伙计。
  • 我认为问题在于 HttpContext.Current.Session["pdfDocument"] 将返回类型对象而不是 System.Web.SessionState.HttpSessionState。对象 ss = HttpContext.Current.Session["pdfDocument"] ??假的;
  • System.Web.SessionState.HttpSessionState ss = ((HttpContext.Current.Session["pdfDocument"])!=null?((Convert.ToBoolen(HttpContext.Current.Session["pdfDocument"] ))?true:false):)
  • 所以这里的一般要点是我试图做的只是错误的 - 坚持使用嵌套的 ifs?
  • 我对获得 -2 票反对感到有点恼火。我的问题肯定是清晰简洁的吗?

标签: c# session session-variables ternary-operator conditional-operator


【解决方案1】:

为什么要使用 ss 变量?

这个呢:

if (HttpContext.Current.Session["pdfDocument"] != null)
{
    Label1.Text = (String)Session["docName"];
}

【讨论】:

    【解决方案2】:
        object ss = HttpContext.Current.Session["pdfDocument"] ?? false; 
        if ((Boolean)ss) 
        { 
            Label1.Text = (String)Session["docName"]; 
        } 
    

    【讨论】:

      【解决方案3】:

      不知道你到底在问什么,怎么样:

      System.Web.SessionState.HttpSessionState ss;
      
      Label1.Text = (Boolean)((ss = HttpContext.Current.Session["pdfDocument"]) ?? false) ? (String)Session["docName"] : Label1.Text;
      

      应该给 ss 留下一个有效的 session 或 null,避免尝试将 false 存储到 ss 的问题,并完全跳过后续的 'if'。虽然有Label1.Text的重复。

      注意:本文已根据 Dave 下面的评论进行了编辑。

      【讨论】:

      • 我很确定这不会编译,因为您已将 ss 声明为 HttpSessionState 对象,并且您试图将该类型与不兼容的 bool 类型合并为空.
      • 抱歉,我的操作员优先级已经偏离了。因为 '=' 的优先级低于 '??' ss = HttpContext.Current.Session["pdfDocument"] 需要一组额外的括号。如: (Boolean)((ss = HttpContext.Current.Session["pdfDocument"]) ?? false)
      【解决方案4】:

      问题是你不能这样做:

      SessionState.HttpSessionState ss = false;
      

      尝试将嵌套的 if 放入扩展方法中,然后调用它。

      【讨论】:

        【解决方案5】:

        HttpContext.Current.Session 是一个 System.Web.SessionState.HttpSessionState 对象,它是不同对象的哈希或字典,有些人可能称之为字典,因此除非您将 HttpSessionState 对象存储为第一行的“pdfDocument”位置不正确。

        如果您实际上将 bool 存储在“pdfDocument”位置中,而该位置可能已经或可能尚未在此插槽中,您可以将其直接转换为布尔值并 null 合并它:var ss = (bool)(HttpContext.Current.Session["pdfDocument"] ?? false);

        如果您可能在“pdfDocument”位置存储某种其他类型的对象,您可以通过检查 null 来查看它当前是否在该位置:var ss = HttpContext.Current.Session["pdfDocument"] != null;

        【讨论】:

          【解决方案6】:

          你可以试试这个,虽然不知道合不合你的审美:

          bool isPdfDocumentSet =
               bool.TryParse((HttpContext.Current.Session["pdfDocument"] as string, 
                   out isPdfDocumentSet)
                       ? isPdfDocumentSet
                       : false;
          

          编辑:实际上有一种更简洁的方法:

          bool isPdfDocumentSet =
               bool.TryParse(HttpContext.Current.Session["pdfDocument"] as string, 
                    out isPdfDocumentSet) && isPdfDocumentSet;
          

          【讨论】:

          • bool.TryParse 的第一个参数接受string,而不是HttpSessionState[ string ] 索引器返回的object。此外,即使您尝试将“pdfDocument”中的值转换为字符串,您也会假设您将存储bool.TryParse 可以解析的字符串值。
          • 你是对的对象部分。然而,正是因为我不想假设它可以被解析,所以我使用 TryParse(),而不是 Parse()。
          • 通过添加ToString() 现在,如果会话中该位置没有任何内容,您将获得NullReferenceException
          • 如果“pdfDoucment”中的值为bool,则始终为假bool baddness() { bool parsed; bool.TryParse(((object)true) as string, out parsed); return parsed; } 将始终返回false
          • 我想我被这个失败的事业冲昏了头脑......感谢 4 抽出时间陪我。
          【解决方案7】:

          我认为您最接近采用该路径的解决方案如下:

          System.Web.SessionState.HttpSessionState ss = HttpContext.Current.Session["pdfDocument"];
          if (ss != null)
          {
              Label1.Text = (String)Session["docName"];
          }
          

          【讨论】:

          • 这不会编译,因为您错误地假设 HttpSessionState[ string ] 索引器将返回一个 HttpSessionState 对象,而实际上它只返回一个 object
          猜你喜欢
          • 2017-10-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-19
          相关资源
          最近更新 更多