繁体   English   中英

Scope 的 static 内部 class 在 Z9E0DA8438E1E38A1C30F4B76CE7B8

[英]Scope of static inner class in ASP.NET

我不确定非静态 ZA2F2ED4F8EBC046BB4C21A2DC 的一个 static 内部 class 的 scope。

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

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? 如果是这样,还有其他方法吗?

我不确定将 static class 修改为私有(正如我所做的那样)是否有效。

谢谢!

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM