尝试实现singleton会给我带来stackoverflow错误c#
我试图创建一个单例来说明我将要创建的所有控制器。当我运行网站时,我得到了stackoverflow错误。 这是我的单身班:尝试实现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
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将自动调用静态构造函数