Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单例构造函数问题_C#_Singleton - Fatal编程技术网

C# 单例构造函数问题

C# 单例构造函数问题,c#,singleton,C#,Singleton,我在c#中创建了一个Singleton类,它具有一个公共属性,我希望在第一次调用Singleton时初始化该属性 这是我写的代码: public class BL { private ISessionFactory _sessionFactory; public ISessionFactory SessionFactory { get { return _sessionFactory; } set { _sessionFactory = v

我在c#中创建了一个Singleton类,它具有一个公共属性,我希望在第一次调用Singleton时初始化该属性

这是我写的代码:

public class BL
{
    private ISessionFactory _sessionFactory;
    public ISessionFactory SessionFactory
    {
        get { return _sessionFactory; }
        set { _sessionFactory = value; }
    }

    private BL()
    {
        SessionFactory = Dal.SessionFactory.CreateSessionFactory();
    }

    private object thisLock = new object();

    private BL _instance = null;
    public BL Instance
    {
        get
        {
            lock (thisLock)
            {
                if (_instance == null)
                {
                    _instance = new BL();
                }
                return _instance;
            }
        }
    }
}
据我所知,当我第一次在BL类中处理实例BL对象时,它应该加载构造函数,并初始化SessionFactory对象

但当我尝试时: BL.Instance.SessionFactory.OpenSession(); 我得到一个空引用异常,我看到SessionFactory是空的


为什么?

这不是单身汉。你应该参考Jon Skeet的优秀指南。例如,使用以下模式:

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

请特别注意实例是静态的。

BL.instance
甚至不应该编译,因为
实例
不是一个
静态
属性。。。我认为
实例
实例
这个锁
应该都是
静态的
。是Dal.SessionFactory.CreateSessionFactory();返回null?您使用的是什么版本的C#/.NET?好的,那么我应该将ISessionFactory对象的初始化放在哪里(Dal.SessionFactory.CreateSessionFactory())?@gillyb:看起来它应该是类的只读实例成员,在构造函数中初始化。不过,您可能想先阅读以下内容: