尝试实现单例给我 stackoverflow 错误 c#

Trying to implement singleton gives me stackoverflow error c#

我正在尝试制作一个单例来说明我将要创建的所有控制器。当我 运行 网站时,我收到了 Whosebug 错误。 这是我的单身人士 class:

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;
    }
}

这就是我在另一个 class 中使用单例 class 的方式:

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# 中使用静态 classes 所需的唯一代码。构造函数不是 public,因为它会在您第一次使用此 class 时自动调用。这个class只有一个实例。

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;
    }
}