C# Windows 窗体应用程序中的全局变量方法? (是公共静态类 GlobalData 最好的)

Posted

技术标签:

【中文标题】C# Windows 窗体应用程序中的全局变量方法? (是公共静态类 GlobalData 最好的)【英文标题】:Global variable approach in C# Windows Forms application? (is public static class GlobalData the best) 【发布时间】:2009-10-03 23:43:11 【问题描述】:

我希望在我的 C# Windows 窗体应用程序中提供一些自定义配置(从文件中读取)。

是说的概念:

    创建一个静态类,例如“公共静态类 GlobalData” 从主窗体事件的“加载”动作加载

这听起来怎么样?这是最好的做法吗?

【问题讨论】:

如何使用 Windows 窗体的内置设置功能? 或资源文件,如果设置是错误消息,例如。 我可以补充一点,静态数据不是普遍接受的“最佳实践”。 【参考方案1】:

正如其他人所说,您可以使用 AppSettings 来存储简单数据。基础很简单;超越它们很难(见App.Config and Custom Configuration Sections)。还可以将类序列化为 XML 或JSON,编写自定义存储格式,使用数据库等。

使配置在整个应用程序中可用是一个单独的问题。静态类和单例本身就很难test,并在你的其他类中引入coupling。一种选择是为您的配置数据类创建一个接口,在启动时创建并加载配置,然后将 interface 传递给任何需要它的类(通常作为构造函数参数)。这称为Dependency Injection。

如果您经常这样做,有一些库可以让您更轻松(在您完成学习曲线之后)。见List of .NET Dependency Injection Containers (IOC)。

【讨论】:

谢谢 - “然后通过接口”到底是什么意思?我喜欢你关于一些解耦的建议,但不要将持有猪转向完整的依赖注入框架(这将是矫枉过正)。 @Greg:所以你的 Foo 类需要访问一个配置参数。 Load 或 Main 创建 MyCustomConfig 类并调用它的 Load 方法(或者你已经定义了它)。 MyCustomConfig 实现接口 IMyCustomConfig,它公开了所有属性。然后,您的 Foo 类将具有 Foo(IMyCustomConfig config) 的构造函数。如果 Load/Main 创建 Foo,它会将其 MyCustomConfig 实例传递给它。如果 Foo 创建 Bar 并且 Bar 需要一个配置,Foo 将其配置传递给 Bar 的构造函数,依此类推。如果你有很多关卡,那就考虑一个 DI 框架。【参考方案2】:

查找 ConfigurationManager.AppSettings。

http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx的示例代码

【讨论】:

内置的设置机制呢?比AppSettings干净多了。 嗯,我只用过 ConfigurationManager。代码中的符号非常干净。但是 app.config 文件可能会变得非常丑陋。 与上一个建议类似,鉴于我想要访问的实际配置是通过序列化创建/加载的 XML 文件,我仍然不确定您是如何建议我加载/授予访问权限的我的 winforms 程序,通过使用用户或应用程序设置方法?【参考方案3】:

我会犹豫是否使用“GlobalData”静态类,因为它带有通用 Utils 类型的包罗万象类的味道,最终可能成为各种垃圾的倾倒场。我更倾向于使用 Windows 窗体设置(无论是用户设置还是应用程序设置)来存储我的配置信息。然后,可以使用 Properties.Settings.Default.MySetting 从 Winforms 项目中的任何位置检索您的配置数据。

话虽如此,我可以将一些东西保存在静态类中。例如,我有一个静态 SqlDBConnectionInfo 对象,其中包含我的服务器、数据库和凭据,这些凭据可用于创建 Sql Connection 对象或执行 SMO 备份/恢复操作。这个静态对象在登录时被实例化,任何其他需要以某种方式使用 SQL 数据库的类都可以获取该静态对象。

编辑: 另一种可能性是,如果您使用实例类对配置数据进行反序列化/序列化,您可以在 Program.cs 中创建一个静态属性来保存反序列化配置的实例目的。然后,您项目中的其他类可以使用:MyProjectName.MyConfigurationObject 引用您的配置数据。

【讨论】:

鉴于我想要访问的实际配置是通过序列化创建/加载的 XML 文件,我仍然不确定您是如何建议我通过使用加载/授予对我的 winforms 程序的访问权限的用户或应用程序设置方法? @Greg:我建议您将配置信息移动到项目的设置中(右键单击项目-> 属性-> 设置选项卡。如果这不可行,请参阅我的上次编辑。跨度> 【参考方案4】:

我对窗口位置和大小等简单值使用默认设置文件。这很好,因为设置已编译为您的属性。您可以以任何您喜欢的方式实施其他设置。

我不经常在 Windows 窗体中使用应用程序设置文件。我一直在 ASP.NET 中使用它们。有时,我将信息存储在内存中的DataTables 中,并使用DataTable.LoadWriteXml 函数来持久化信息。

关于全局访问,在 Windows 窗体中,我在项目中添加了一个 Component 类,并在 Main 中创建了一个全局静态实例。然后我可以从所有表单中引用该实例并将全局数据添加到该组件。数据作为属性或通过函数公开。

【讨论】:

【参考方案5】:

按照以下步骤完成全局数据保存:

    创建一个静态类来保存数据:

静态类全局变量 静态字符串名称; 静态字符串电子邮件;

    public static String Name
    
        get  return Globals.name; 
        set  Globals.name = value; 
    

    public static String Email
    
        get  return Globals.email; 
        set  Globals.email = value; 
    


    如果您有登录页面,例如填充静态类,否则您可以根据需要在任何地方填充静态全局类。

    private void btnLogin_Click(object sender, EventArgs e)
    
    
        if (!validate())
            return;
    
        // for admin
        if (txtUserName.Text == "a" && txtPassword.Text == "a")
        
            this.Hide();
            Globals.Email = txtUserName.Text;
            Globals.IsAdmin = true;
            Globals.Password = txtPassword.Text;
    
            // show other form
            FrmMain frmmain = new FrmMain();
            frmmain.ShowDialog();
    
            // close application
            //this.Close();
    
        
    
    
    

【讨论】:

以上是关于C# Windows 窗体应用程序中的全局变量方法? (是公共静态类 GlobalData 最好的)的主要内容,如果未能解决你的问题,请参考以下文章

C# Windows 窗体应用程序,两个带有一个字符串变量的 .cs 文件

C#两窗体(或类)之间传值

C#如何在一个窗体中读取另一个窗体的控件的数据

我用C#创建的是windows窗体应用项目,做的是登陆页面,里面可以使用session吗

在C#一个程序中,将一个窗体中的数据传送到另一个窗体

C#基础——全局静态类中的静态类变量的设置