《程序员》杂志今年第8期76-90页, Juval Lowy 的文章: C#编码标准/指导和最佳实践,
这是篇好文章, 但是我们来看看技术专家的评析。82-83页: ASP.NET 和 Web Services (评析人: 金戈) 3. 在访问一个 Session 变量前, 总要检查它是否为 null。
11. 用一个局部属性一封装一个 Session 变量, 只有这个局部属性有权访问 Session,
    其他的代码只能访问这个属性, 而不能直接访问 Session 变量。int Memory
{
  get
  {
    int memory = 0;
    object state = Session["Memory"];
    if (state != null)
    {
      memory = (int)state;
    }
    return memory;
  }
  set
  {
    Session["Memory"] = value;
  }
}82页 Juval Lowy 先生的上述代码段已经很清楚了。金戈先生的评析在83页又给出了一个几乎一样的代码段, 把局部属性改为 public 的, 我看
不出来复制这么一个如此相似的代码段有何意义。更为遗憾的是在 set 方法中居然出现了这
样一个表达式 value==null ? -1 : value, 这个判断纯属画蛇添足, 并且不可能通过编
译, 因为 LastItemID 是一个 int 属性, value 是 int 型的, 不是引用类型, 怎么能
与 null 进行比较呢?public int LastItemID
{
  get
  {
    object sessionLastItemID = Session["LastItemID"];
    int lastItemID = -1;
    if (sessionLastItemID != null)
    {
      lastItemID = (int)sessionLastItemID;
    }
    return lastItemID;
  }
  set
  {
    Session["LastItemID"] = value==null ? -1 : value;
  }
}

解决方案 »

  1.   

    确实如此,不过关于
    value==null?-1:value
    最好把null写前面,偶尔笔误容易找一点
      

  2.   

    什么叫"确实如此"?value==null 根本不可能通过编译, 因为 value 是 int 型, 将会引发如下编译器错误:
    error CS0019: Operator '==' cannot be applied to operands of type 'int' and '<null>'另, "最好把 null 写前面, 偶尔笔误容易找一点", 这句话也不成立, C# 的条件表达式要求
    是 bool 型的, 象 (value = 0) ? -1 : value 之类少写一个 '=' 的错误将引发 CS0029 编
    译器错误: 无法将类型隐式转换, 没有必要象 C 中那样把常量写在条件表达式左端预防笔误.当然, (IsPositive == true) ? 1 : -1 或 (IsPositive == false) ? -1 : 1 这种表达式
    最好改写如下: IsPositive ? 1 : -1 或 !IsPositive ? -1 : 1, 不然的话, 少写一个 '='
    可真不会引发编译器错误.
      

  3.   

    其实,访问Session我有一个方案大家可以参考一下:
    在页面基类中定义方法:
    public void SetSessionVar(GlobalKeys key,object value)
    public object GetSessionVar(GlobalKeys key)
    其中,GlobalKeys是一个enum,所有需要使用Session的地方都应该先去该枚举添加一个枚举项,此项将作为Session中的Key,这样就防止了Session中的Key重复.
    当然还可以判空和清空函数:
    public void RemoveSessionVar(GlobalKeys key)
    public bool IsSessionVarNull(GlobalKeys key)
      

  4.   

    真正比较安全的办法还是要自己写一个类,然后把容纳自己的Session作为自己的成员,随时效验。如:class SafetyInfo
    {
      private string _sessionid;  public void WriteToSession( HttpSessionModule Session)
      {
        Session["com.xxxxxx.www.SafetyInfo"] = this;
        _sessionid = Session.SessionID;
      }  public static SafetyInfo GetInstance( HttpSessionModule Session )
      {
        SafrtyInfo _instance = Session[["com.xxxxxx.www.SafetyInfo"];
        if ( _instance == null || _instance._sessionid != Session.SessionID )
          return null;
        else
          return _instance;
      }
    }