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.Load
和WriteXml
函数来持久化信息。
关于全局访问,在 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 文件