关于何时使用应用程序设置(不是每个用户设置)与 .config 文件 <appsettings> 是否有任何建议?
更新
希望了解一些更细微和重要的差异,因为它们都是有效的键/值存储。例如,我知道在 web.config 中修改 appsettings 会回收 Web 应用程序。
设置已经在 .NET 中使用了一段时间,我懒得去看它们——也许一个有点多余,或者同时使用两者没有意义......这就是我所关心的那种细节寻找了解和原因。
关于何时使用应用程序设置(不是每个用户设置)与 .config 文件 <appsettings> 是否有任何建议?
更新
希望了解一些更细微和重要的差异,因为它们都是有效的键/值存储。例如,我知道在 web.config 中修改 appsettings 会回收 Web 应用程序。
设置已经在 .NET 中使用了一段时间,我懒得去看它们——也许一个有点多余,或者同时使用两者没有意义......这就是我所关心的那种细节寻找了解和原因。
这个问题有点老了,但我偶然发现它并想增加一些清晰度,以防其他人也偶然发现它......
设置选项(相对于原始的 <appSettings> 部分)在框架中具有强大的支持:
设置是强类型的(即 bool、int、ConnectionString 等),而不是全部作为字符串返回,以便在需要时由您的代码解析。
设置的范围可以是 a) 内部或公共,以及 b) 每个用户或每个应用程序(后者本质上是指每台机器)。
您的应用程序需要提供自己的接口来更改设置,但这相当简单,因为设置属性在代码中是读/写的,并且生成的类提供了保存更改的功能。
部署的 app.config(或 web.config)文件仅存储默认值(请参阅下文了解如何处理运行时更改) - 这意味着更改设置并在运行时保存它们不会更改 .config 文件 -并且通过扩展不会导致您的应用程序重新启动。
根据选择的范围,运行时的更改将保存到本地位置(在 c:\ProgramData.. 或 c:\Users\MyUser\AppData\Local.. 中的某个位置)。因此,您的应用程序的后续版本可以安全地引入新设置,而不必担心破坏以前自定义的值,因为它们被安全地存储起来。
希望这有助于澄清一些事情。
到目前为止,答案似乎忽略了一点,即 .config 文件可以使用转换文件进行转换。默认情况下,这些可用于 Web.config 文件(在 Visual Studio 中),并且可以使用用于 Visual Studio 的SlowCheetah - XML Transforms加载项为任意 .config 文件启用(SlowCheetah 还添加了一个预览器并在构建时应用转换,而不仅仅是在部署.
应用程序设置和配置文件 appSettings 部分仅限于键值对,这对于简单的设置很有用,但如果您需要更健壮的数据持久性,您可能会考虑为您的应用程序创建自定义配置部分。这是有关创建自定义配置部分的 stackoverflow 文章
享受!
可以键入应用程序设置,这与 appsettings 相比是一个优点。访问它们的方式比从数组中获取值更简洁(属性)。
您可以使用该接口来实现一个设置类,该类将您的设置存储在数据库中。
我之前做过的事情是创建一个类,其中包含与要持久化的设置相适应的属性。然后将一个类实例 XML 序列化为一个文件,然后可以反序列化以返回相同的对象、属性值不变。并且应用程序不需要被回收,如果您写入 web.config/app.config 文件,它就会被回收。
您可以通过这种方式获得强类型的应用程序设置,而不必担心键和值。当我想在应用程序中提供用户可设置的选项时,这对我来说效果很好。
需要注意的一件事是,如果您通过 ClickOnce 进行部署,尽管配置文件现在是可写的,但它们不在 ClickOnce 部署的应用程序中,因为它会填充文件哈希。
因此,经验法则是任何环境配置都放在 app.config 中。任何用户配置都在“设置”中。
有时这条线有点模糊,所以对于那些模糊的线,我会用静态访问器方法包装,这样你就可以随意移动它们。
应用程序设置不会编译到程序集中。
我不确定,但我认为应用程序设置默认值已编译到程序集中,但这些可以在配置文件中被覆盖。
我认为应用程序设置是作为一种更友好的方式创建的,特别是来自 VB.Net,但我不认为有任何巨大的差异。至少对于简单的设置,我更喜欢应用程序设置,原因是 LeonG 的回答。
我创建了一个测试应用程序来探索,因为我也从未费心查看设置。以下是一些随机发现。
Properties.Settings.Default.myColor = Color.AliceBlue;
,但这总是为您提供默认值,该值作为属性的属性编译到您的代码中。(我使用 Reflector 验证了这一点。getter 带有以下标记:)[ApplicationScopedSetting, DefaultSettingValue("asdf"), DebuggerNonUserCode]
。总的来说,它们看起来非常相似。“设置”对话框将为您提供一种在设计时配置值的设计方式,以确保其物有所值。它还将为您处理序列化。我确信有某种方法可以获得实际值而不是默认值,如果这是您存储的内容,这将是撤消任何用户自定义的好方法(IE,而不是使用当前值,只需引用默认值值。)不过,我目前不知道如何引用当前值。