gpt4 book ai didi

c# - 在 C# 应用程序中使用单例

转载 作者:行者123 更新时间:2023-11-30 20:48:20 24 4
gpt4 key购买 nike

过去几天我一直在阅读和尝试不同的方法来创建和使用我的一个类文件的单例实例,然后在程序的整个生命周期中使用我需要的引用,这里是 stackoverflow 以及其他几个站点,并且发现有太多有用的意见、建议和示例让我有点困惑,尤其是在实际使用单例对象时。

我有一些功能,但我认为这不是最正确的方法,我可能会漏掉一个步骤。

我的程序中有一个名为 clsRegistry 的简单类文件作为单例实现。

public sealed class clsRegistry
{
//http://tech.pro/tutorial/625/csharp-tutorial-singleton-pattern

private static clsRegistry RegInstance;

private clsRegistry() { }

public static clsRegistry GetInstance()
{
lock (typeof(clsRegistry))
{
if (RegInstance == null)
{
RegInstance = new clsRegistry();
}
return RegInstance;
}
}

public string dataBase { get; set; }
public string userId { get; set; }
public string passWord { get; set; }

public void ReadKeys()
{
//http://stackoverflow.com/questions/1388787/information-in-registry
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Key1\Key2\Key3");
dataBase = key.GetValue("ADODataSource").ToString().Trim();
userId = key.GetValue("ServerUserID").ToString().Trim();
passWord = key.GetValue("ServerPassword").ToString().Trim();
}
} // end class definition

当从 Main 方法调用时正确实现并调用类中的一个公共(public)方法 (ReadKeys)

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// create instance of registry class
clsRegistry regData = clsRegistry.GetInstance();

// call method
regData.ReadKeys();

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new frmMain());
Application.Run(new frmLogin());
}
}

创建类的单例后,我加载了一个小的登录表单,我希望单例中的数据库名称显示在表单中,这是我的代码不够优雅的地方。

private void frmLogin_Load(object sender, EventArgs e)
{
// create a 'new' instance to the singleton?
clsRegistry regData = clsRegistry.GetInstance();

lblDataBase.Text = regData.dataBase;
}

我是否真的需要创建另一个对我的单例对象的引用以读取一些值(或稍后调用另一个方法),或者我是否遗漏了某个步骤?我的操作假设是,一旦我将一个类的实例创建为单例并且它保留在同一个命名空间中,我就可以访问任何公共(public)值或方法。没有?

作为引用,我使用的是 Visual Studio 2010 和 4.0 框架(是的,我是另一个最终跳槽的经典 VB 开发人员)

最佳答案

首先,微软有guidelines专门在 C# 中实现单例,详细解释了创建单线程和多线程单例类的最佳方法。

就您的代码而言:

  1. 调用 GetInstance 时,您并没有创建对象的另一个实例。该代码返回先前创建的实例。如果类为 null(仅一次),它只会实例化该类的新实例。

  2. 在 .NET 中,您应该使 Instance 成为属性而不是方法(这样更简洁)。

  3. 在编写 .NET 代码时,您应该坚持使用 Pascal 大小写,如果您正在编写 Java 代码,我建议您坚持使用驼峰式大小写,因为这是该语言的标准大小写。

关于c# - 在 C# 应用程序中使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com