尝试实现单例给我 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;
}
}
我正在尝试制作一个单例来说明我将要创建的所有控制器。当我 运行 网站时,我收到了 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;
}
}