ASP.NET中静态内部类的范围

时间:2009-03-21 11:02:26

标签: c# asp.net class static scope

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

在下面的行中,变量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;
        }
    }

3 个答案:

答案 0 :(得分:2)

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

如果你想根据Page的实例做出某些事情,那么它必须是Page中的实例变量。 (顺便说一句,我建议不要将案例命名为基类。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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