C# 这是Singleton+;延迟加载?

C# 这是Singleton+;延迟加载?,c#,session,design-patterns,singleton,lazy-loading,C#,Session,Design Patterns,Singleton,Lazy Loading,我试图弄清楚这段代码中使用了什么模式。 我的理解是,这是一个 单例模式(实际上有一个私有构造函数)和 延迟加载(或延迟初始化?) 我也被这个问题弄糊涂了 UserSession属性,它是类的同一类型,其用法在我看来很奇怪 有人能解释一下这里发生了什么吗?这里我看到了单例模式: 类的静态方法在类实例不存在时生成类实例 至于懒散加载,我不确定我们是否可以看到这样的情况,因为懒散加载的想法是为了节省资源,但在这里我们可以看到一个轻量级对象 使用类的静态方法获取同一个类的实例是一种常见做法,但不是最佳方

我试图弄清楚这段代码中使用了什么模式。 我的理解是,这是一个

  • 单例模式(实际上有一个私有构造函数)和
  • 延迟加载(或延迟初始化?)
  • 我也被这个问题弄糊涂了

  • UserSession属性,它是类的同一类型,其用法在我看来很奇怪

  • 有人能解释一下这里发生了什么吗?

    这里我看到了单例模式: 类的静态方法在类实例不存在时生成类实例

    至于懒散加载,我不确定我们是否可以看到这样的情况,因为懒散加载的想法是为了节省资源,但在这里我们可以看到一个轻量级对象


    使用类的静态方法获取同一个类的实例是一种常见做法,但不是最佳方法。更好的选择是使用上下文获取类的实例,避免使用静态方法,因为它可以从应用程序的任何地方调用,但这里我们面临的是HttpContext。在我看来,当前的静态属性本身就是一个设计问题,因此我们可以像那样使用UserContext。

    “有人能解释一下这里发生了什么吗?”
    static UserSession
    (只读)属性返回
    HttpContext.Current.Session[“\u UserSession”]
    ,如果
    null
    ,则首先实例化它。显然,它存储的对象类型为
    UserSession
    。是。如果用户会话在会话中不存在,它将被创建并卡在其中。但是,请考虑如果两个线程同时开始执行此代码会发生什么,特别是null检查-它们将分别创建一个新的UserSession对象并返回两个不同的对象。这样的典型单例包括一个锁和两个空检查。您可以通过使用
    Lazy
    来解决这个问题,它为您处理所有的管道。我认为它不可能是正确的单例,因为它不是线程安全的。双锁模式可能安全,也可能不安全。这取决于你的CPU架构和它如何刷新缓存线,远远超出了我的工资等级。就用懒惰。如果使用锁,只需放弃锁外的null检查,或者非常熟悉目标的每个体系结构。
    public class UserSession
    {
       private UserSession()
       {
       }
    
       public static UserSession Current
       {
           get
           {
               var session= (UserSession)HttpContext.Current.Session["_userSession"];
               if (session == null)
               {
                   session = new UserSession();
                   HttpContext.Current.Session["_userSession"] = session;
               }
               return session;
           }
       }
    
       public User User { get; set; }
    }
    
    //USAGE
    UserSession.Current.User