【问题标题】:Static property in ASP.Net based on session will be shared across all users?ASP.Net 中基于会话的静态属性将在所有用户之间共享?
【发布时间】:2014-07-07 17:13:36
【问题描述】:

对于以下 2 个静态属性,是否会在 ASP.net 网站中的所有用户之间共享?似乎 Property2 将在 ASP.Net 网站的所有用户之间共享,但不确定 Property1。

public static object Property1 {
get { return HttpContext.Current.Session["some_key"]; }
set {  HttpContext.Current.Session["some_key"] = value;}
}

public static object Property2 { get;set;}

【问题讨论】:

  • Property1 肯定不会。它显然与会话有关。

标签: c# asp.net static-members


【解决方案1】:

Property1 仅在用户当前会话的范围内。静态部分不会改变这一点,因为它只是指向用户特定数据的会话的包装器。

Property2 是对所有用户都相同的常规静态属性。

【讨论】:

  • Property2 不是基于隐式定义的私有类级别变量,例如“私有对象 _property2;”。在那种情况下,每个用户会有所不同吗?
  • 如果任何用户为 property2 分配了一个值,所有其他用户都会看到它,因为它是在类型级别定义的静态属性。 Property1 是一个特例,因为它包装了以用户为中心的数据
  • 好的。我认为为 Property2 隐式定义的私有级别变量也会被 CLR 定义为静态的。但是,如果我们为 Property2 明确定义了一个私有非静态变量,那么我猜 Property2 的行为就像一个非静态属性。
  • 如果属性是静态的,则不能定义实例级别的支持字段。它不会编译
  • 哦,好的。我没有意识到这一点。
【解决方案2】:

Property1 中的 getter/setter 方法将引用特定的会话。由于 Property2 没有任何自定义 getter/setter,因此底层私有变量存储在应用程序范围内,即将在 ASP.Net 网站的所有用户之间共享。

从学习的角度来看,这是一个很好的例子,可以看出差异。将静态转换为“非静态-y”的能力显示了编码中的灵活性,但实际上您可能希望避免调用 Property1 静态,主要是因为您的静态属性没有遵循静态变量的行为一次您引用会话变量。它可能完全按照您的意愿工作,但是在您之后或与您一起进来的其他开发人员可能会对为什么它需要是静态的感到困惑。每种情况都不同,但是如果您愿意,这里引用单个会话的静态属性似乎会造成意图冲突。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多