【问题标题】:Scope of static inner class in ASP.NETASP.NET中静态内部类的作用域
【发布时间】:2009-03-21 11:02:25
【问题描述】:

我不确定非静态类的一个静态内部类的范围。

在下面的行中,变量 DataContextCreator.Instance(Singleton 模式的一部分)是指向所有 Page 对象/页面请求的同一个 PDataContext 实例,还是每个对象都有自己的实例?

public class Page : System.Web.UI.Page
{

    private class DataContextCreator
    {
        static DataContextCreator() { }

        public static readonly PDataContext Instance = new PDataContext(TUtil.GetConnectionString());
    }

    public PDataContext DataContext
    {
        get
        {
            return DataContextCreator.Instance;
        }
    }
}

我是否必须使用 HttpContext.Current 才能以所需的方式工作,即没有共享 DataContext?如果是这样,还有其他方法吗?

我不确定将静态类修改为私有(就像我所做的那样)是否有效。

谢谢!

编辑: 这是我的解决方案,我现在具有相同的延迟加载功能,但没有静态变量。在这种情况下,我认为我不需要在持有变量周围放置互斥锁。

    private PDataContext _DataContext;
    private PDataContext DataContext
    {
        get
        {
            if (this._DataContext == null)
            {
                this._DataContext = new PDataContext(TUtil.GetConnectionString());
            }
            return this._DataContext;
        }
    }

【问题讨论】:

  • 如果代码在页面中,则无需加锁。由于该属性是页面的本地属性,因此只有一个线程可以访问它。

标签: c# asp.net class static scope


【解决方案1】:

每个页面都是一样的。静态变量是静态变量,但它是嵌套的。 (泛型使事情变得“有趣”,因为 Foo<int> 中的静态变量与 Foo<string> 等中的静态变量是分开的,但这在这里不相关。)

如果你想让某些东西依赖于Page 的实例,它需要是Page 中的一个实例变量。 (顺便说一下,我建议不要将 case 命名为与其基类相同的名称。)

【讨论】:

  • 谢谢。我刚刚看到使用实例变量很容易做到这一点。我来自单例模式。但这里不需要。
  • 是的,我通常不会在基类之后命名派生类。这是一个现有的课程,由其他人完成。也许改变这一点还为时不晚。
  • 也许有人可以在最新的编辑中快速查看我的解决方案,如果有任何问题,请发布。
  • 只要只有一个线程将使用实例,新代码似乎是合理的。
【解决方案2】:

嵌套类纯粹是为了命名方便(以及一些修饰符更改(私有等))。就行为而言,它们实际上与常规(顶级)类相同。所以Instance 是完全共享的(它不绑定到 Page 实例)。

【讨论】:

    【解决方案3】:

    由于Instance 变量是静态的,它只存在一次,所以所有线程共享相同的值。将变量放在另一个类中不会改变静态变量的工作方式。

    要创建页面实例的本地单例,您可以将引用存储在页面上下文中:

    public PDataContext DataContext {
       get {
          PDataContext result = HttpContext.Current["PData"];
          if (result == null) {
             result = new PDataContext(TUtil.GetConnectionString());
             HttpContext.Current["PData"] = result;
          }
          return result;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2011-05-10
      • 2018-08-28
      • 2013-07-28
      相关资源
      最近更新 更多