24

关于何时使用应用程序设置(不是每个用户设置)与 .config 文件 <appsettings> 是否有任何建议?

更新
希望了解一些更细微和重要的差异,因为它们都是有效的键/值存储。例如,我知道在 web.config 中修改 appsettings 会回收 Web 应用程序。

设置已经在 .NET 中使用了一段时间,我懒得去看它们——也许一个有点多余,或者同时使用两者没有意义......这就是我所关心的那种细节寻找了解和原因。

4

8 回答 8

16

这个问题有点老了,但我偶然发现它并想增加一些清晰度,以防其他人也偶然发现它......

设置选项(相对于原始的 <appSettings> 部分)在框架中具有强大的支持:

  1. 设置是强类型的(即 bool、int、ConnectionString 等),而不是全部作为字符串返回,以便在需要时由您的代码解析。

  2. 设置的范围可以是 a) 内部或公共,以及 b) 每个用户或每个应用程序(后者本质上是指每台机器)。

  3. 您的应用程序需要提供自己的接口来更改设置,但这相当简单,因为设置属性在代码中是读/写的,并且生成的类提供了保存更改的功能。

  4. 部署的 app.config(或 web.config)文件仅存储默认值(请参阅下文了解如何处理运行时更改) - 这意味着更改设置并在运行时保存它们不会更改 .config 文件 -并且通过扩展不会导致您的应用程序重新启动。

  5. 根据选择的范围,运行时的更改将保存到本地位置(在 c:\ProgramData.. 或 c:\Users\MyUser\AppData\Local.. 中的某个位置)。因此,您的应用程序的后续版本可以安全地引入新设置,而不必担心破坏以前自定义的值,因为它们被安全地存储起来。

希望这有助于澄清一些事情。

于 2012-04-25T14:18:21.867 回答
6

到目前为止,答案似乎忽略了一点,即 .config 文件可以使用转换文件进行转换。默认情况下,这些可用于 Web.config 文件(在 Visual Studio 中),并且可以使用用于 Visual Studio 的SlowCheetah - XML Transforms加载项为任意 .config 文件启用(SlowCheetah 还添加了一个预览器并在构建时应用转换,而不仅仅是在部署.

于 2013-02-01T17:43:09.157 回答
3

应用程序设置和配置文件 appSettings 部分仅限于键值对,这对于简单的设置很有用,但如果您需要更健壮的数据持久性,您可能会考虑为您的应用程序创建自定义配置部分。这是有关创建自定义配置部分的 stackoverflow 文章

享受!

于 2010-06-04T16:47:15.823 回答
2

可以键入应用程序设置,这与 appsettings 相比是一个优点。访问它们的方式比从数组中获取值更简洁(属性)。

您可以使用该接口来实现一个设置类,该类将您的设置存储在数据库中。

于 2010-06-04T16:56:29.587 回答
1

我之前做过的事情是创建一个类,其中包含与要持久化的设置相适应的属性。然后将一个类实例 XML 序列化为一个文件,然后可以反序列化以返回相同的对象、属性值不变。并且应用程序不需要被回收,如果您写入 web.config/app.config 文件,它就会被回收。

您可以通过这种方式获得强类型的应用程序设置,而不必担心键和值。当我想在应用程序中提供用户可设置的选项时,这对我来说效果很好。

于 2010-06-05T06:07:59.743 回答
1

需要注意的一件事是,如果您通过 ClickOnce 进行部署,尽管配置文件现在是可写的,但它们不在 ClickOnce 部署的应用程序中,因为它会填充文件哈希。

因此,经验法则是任何环境配置都放在 app.config 中。任何用户配置都在“设置”中。

有时这条线有点模糊,所以对于那些模糊的线,我会用静态访问器方法包装,这样你就可以随意移动它们。

于 2010-06-04T17:51:14.220 回答
0

应用程序设置不会编译到程序集中。

我不确定,但我认为应用程序设置默认值已编译到程序集中,但这些可以在配置文件中被覆盖。

我认为应用程序设置是作为一种更友好的方式创建的,特别是来自 VB.Net,但我不认为有任何巨大的差异。至少对于简单的设置,我更喜欢应用程序设置,原因是 LeonG 的回答。

于 2010-06-04T17:04:38.303 回答
0

我创建了一个测试应用程序来探索,因为我也从未费心查看设置。以下是一些随机发现。

  • Settings 为您提供了在代码中引用的显式属性/名称,但如果您反汇编已编译的应用程序,则 getter 只是在其内部字典中查找值。
  • 设置会被吐回到您自己部分的 .config 文件中。看起来您可以只编辑 .config 文件来更改该值,但事实并非如此,这可以通过以下观点来解释。
  • 根据上面链接的文档,似乎获得该值的唯一方法是使用Properties.Settings.Default.myColor = Color.AliceBlue;,但这总是为您提供默认值,该值作为属性的属性编译到您的代码中。(我使用 Reflector 验证了这一点。getter 带有以下标记:)[ApplicationScopedSetting, DefaultSettingValue("asdf"), DebuggerNonUserCode]
  • 设置是强类型的。编译器会自动处理对象的序列化(不过,这只是几行代码)。

总的来说,它们看起来非常相似。“设置”对话框将为您提供一种在设计时配置值的设计方式,以确保其物有所值。它还将为您处理序列化。我确信有某种方法可以获得实际值而不是默认值,如果这是您存储的内容,这将是撤消任何用户自定义的好方法(IE,而不是使用当前值,只需引用默认值值。)不过,我目前不知道如何引用当前值。

于 2010-06-04T17:40:34.863 回答