尝试实现singleton会给我带来stackoverflow错误c#

尝试实现singleton会给我带来stackoverflow错误c#,c#,asp.net,singleton,C#,Asp.net,Singleton,我试图创建一个单例来说明我将要创建的所有控制器。当我运行网站时,我得到了stackoverflow错误。 这是我的单身班: public class MainController { private DatabaseController databaseController; private UserDBController userDBController; private static MainController MCinstance = null; pu

我试图创建一个单例来说明我将要创建的所有控制器。当我运行网站时,我得到了stackoverflow错误。 这是我的单身班:

public class MainController 
{
    private DatabaseController databaseController;
    private UserDBController userDBController;
    private static MainController MCinstance = null;
    public MainController()
    {
        if (MCinstance == null)
        {
            databaseController = new DatabaseController();
            userDBController = new UserDBController();
        }
    }
    public static MainController Instance
    {
        get
        {
            if (MCinstance == null)
            {
                MCinstance = new MainController();
            }
            return MCinstance;
        }
    }
    public UserDBController GetUserDBController()
    {
        return userDBController;
    }
    public DatabaseController GetDBController()
    {
        return databaseController;
    }
}
以下是我在不同类中使用singleton类的方式:

private UserDBController userDBController = MainController.Instance.GetUserDBController();

我做错了什么?

您应该将
readonly
修饰符添加到
MCinstance
声明中,并在静态构造函数中仅实例化一次

public class MainController 
{

    public static readonly MainController Instance = null;
    static MainController()
    {
        Instance  = new MainController()
    }
}

对于单例使用,需要使用私有构造函数。并将私有构造的代码移动到实例创建的位置

    public class MainController 
    {
        private DatabaseController databaseController = new DatabaseController();
        private UserDBController userDBController = new UserDBController();
        private static MainController MCinstance = null;
        private MainController()
        {

        }
        public static MainController Instance
        {
            get
            {
                if (MCinstance == null)
                {
                    MCinstance = new MainController();
                }
                return MCinstance;
            }
        }
        public UserDBController GetUserDBController()
        {
            return userDBController;
        }
        public DatabaseController GetDBController()
        {
            return databaseController;
        }
    }

您可以像下面这样更改您的实现

public class MainController
{
    private DatabaseController databaseController;
    private UserDBController userDBController;
    private static MainController MCinstance = null;

    static MainController()
    {
        MCinstance = new MainController();
        MCinstance.databaseController = new DatabaseController();
        MCinstance.userDBController = new UserDBController();
    }

    public static MainController Instance
    {
        get
        {               
            return MCinstance;
        }
    }

    public UserDBController GetUserDBController()
    {
        return userDBController;
    }

    public DatabaseController GetDBController()
    {
        return databaseController;
    }
}

本质上,这是使用C#中的静态类所需的唯一代码。构造函数不是公共的,因为第一次使用此类时会自动调用它。这个类只有一个实例

public static class MainController 
{
    private static DatabaseController databaseController;
    private static UserDBController userDBController;

    static MainController()
    {
        databaseController = new DatabaseController();
        userDBController = new UserDBController();
    }

    public static UserDBController GetUserDBController()
    {
        return userDBController;
    }
    public static DatabaseController GetDBController()
    {
        return databaseController;
    }
}

您的代码实际上并不强制使用singleton。不知道此类的开发人员将创建新实例以便在MainController实例上操作。请使用同步方法防止在惰性初始化期间出现线程问题。您的
DatabaseController
UserDBController
构造函数是否访问
MainCotroller.instance
?构造函数?不,不会编译。您无法访问静态成员中的实例字段。是,将thiose变量设为static为什么?为什么建议将字段设置为静态。你确定你的意思吗?看看我有更新。但是你需要一个私有的构造函数来为单身汉投票是不受欢迎的。这不是选举。如果我们觉得你的答案是好的,我们会投票给你。但事实并非如此。问题本身并没有重现指定的问题,而你的答案什么也解决不了。那么我应该在哪里调用构造函数?@user2014780你不需要。当您第一次访问类的任何静态成员ej:MainController.Instance时,CLR将自动调用静态构造函数