提供软件设置的最佳方法是什么?

12

我正在使用C# .NET。

在我的软件中,我通过提供设置对话框让用户设置应用程序设置,我想要将这些设置保存到文件中。

要求(典型):

  1. 我定义的每个类都使用这些设置的某个部分。因此,这些应该是全局的。
  2. 这些应该在软件启动时加载。
  3. 当用户更改设置并单击“保存”/“应用”时,当前设置应更改。

我想知道最佳方法是什么?另外,将这些设置保存到磁盘的最佳方法是什么?我是指是否应创建一个Settings 类对象并将其序列化为“settings.dat”,还是提供结构化文件,如XML / JSON?

这几乎适用于所有其他软件。那么,难道没有设计模式吗?

编辑:

好吧,这是我不知道的事情。很好 :). 但是,假设用户在使用软件时更改了设置,那么使用这些全局Properties.Settings.Default.*的所有其他对象都应更改。是否有任何通知机制?某种事件?

5个回答

13

.Net 项目已经有了“设置”(Settings)的概念,可以分为用户级别和应用级别,它能够满足你上述所有的需求。有一些类可供读取和写入设置。我强烈建议您使用这些类,而不是自己开发。

在 C# 中使用设置

您可以在各种项目类型中使用设置,但在某些类型的项目(如 ASP.Net 项目)中,用户级别的设置可能不可用。


1
@womp,在不同版本之间进行更新可能会变得非常棘手。 - Giorgi
这些设置存储在哪里?是在该项目的程序集(dll/exe)中吗?还是会存储在某种settings.settings文件中,我需要将其与我的软件一起部署? - claws
1
@claws - 对于普通的WPF、WinForms或控制台应用程序,设置存储在一个名为app.config或user.config的XML文件中(取决于设置的类型)。这些文件深埋在用户目录下的文件结构中。`C:\Users\username\AppData\Local\companyname\programname\programversion\ - Jeffrey L Whitledge
@-claws - 给出的那个示例是针对具有标准布局的Windows Vista机器上的user.config。你的情况可能会有所不同。 - Jeffrey L Whitledge
1
@claws,文件存储在Application.LocalUserAppDataPath中。http://msdn.microsoft.com/en-us/library/system.windows.forms.application.localuserappdatapath%28v=VS.80%29.aspx - Giorgi
显示剩余3条评论

7
.Net自带的Settings类非常方便,我在大多数项目中都会使用它。需要注意的是,每个新版本的应用程序都会有自己的设置文件,因此请确保您有合理的默认值。所有设置都将在分发新的EXE时消失。
全局状态很难正确处理,因此我通常将相关设置通过构造函数或属性传递给各种对象。我通常不会将设置更改应用于这些对象,因为在许多情况下,对象很难智能地处理变化的设置。相反,我只是在创建新对象时使用新设置。如果需要立即应用设置,则只需放弃旧对象并创建新对象。这取决于应用程序的细节。
如果您在设置屏幕上有一个“应用”按钮,那么我建议在保存后重新加载和显示所有值。这样,显示屏一定包含实际保存的内容。如果任何设置被解析,则这可能很重要。我曾经遇到过用户在特定字段中输入了一个月和日期组合,他们使用的格式与预期的不同,因此保存的值是不正确的。通过在应用后更新屏幕,可以明显地发现这些错误。
希望这有所帮助!

1
您可以使用Upgrade方法(http://msdn.microsoft.com/en-us/library/system.configuration.applicationsettingsbase.upgrade.aspx)将先前版本的设置移动到新版本中。只需确保仅调用一次即可。 - Giorgi
@Giorgi - 很有趣!我得试一试。 - Jeffrey L Whitledge
请将此链接http://msdn.microsoft.com/en-us/library/aa730869%28VS.80%29.aspx添加到您的答案中,并根据Giorgi的评论进行编辑,以便我可以接受它作为答案。 - claws

3

你和 womp 的都是正确的:

你应该创建一个 Settings 类作为 .NET 设置的门面。这样,你既可以获得自制解决方案的可测试性,又可以获得通常与微软银弹相关联的易于实现性。


0

我个人会选择使用Properties.Settings。在应用程序的Properties文件夹中添加一个Settings文件,这样可以轻松地向应用程序的app.config文件中添加项目。.NET内置了一个类,您可以使用它来读取/写入Settings文件中找到的值。然后,您可以编写一个小包装类来封装该功能,或者只是在各个地方使用内置的.NET。

我个人会创建一个线程安全的Singleton类,该类使用小包装类而不是内置的.NET类。是的,这需要一些额外的工作,但这只是一点点工作,为您的应用程序提供了强大的功能。

编辑:抱歉忘记包括MSDN设置链接。

http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx


0

正如其他人建议的那样,使用设置功能是正确的方法。设置还提供了更新时的事件,因此您可以处理它们并采取必要的操作。您还可以使用升级方法将设置从旧版本移动到新版本中。只需确保仅调用一次(可能来自安装程序)。

设置还可以绑定到控件,因此您不必手动将它们从控件映射到设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接