172

在开发 .NET Windows 窗体应用程序时,我们可以在这些App.config标签之间进行选择来存储我们的配置值。哪一个更好?

<configuration>

  <!-- Choice 1 -->
  <appSettings>
    <add key="RequestTimeoutInMilliseconds" value="10000"/>
  </appSettings>

  <!-- Choice 2 -->
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" >
        <section name="Project1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Project1.Properties.Settings>
      <setting name="TABLEA" serializeAs="String">
        <value>TABLEA</value>
      </setting>
    </Project1.Properties.Settings>
  </applicationSettings>

</configuration>
4

6 回答 6

155

基本<appSettings>的更容易处理 - 只需输入一个<add key="...." value="..." />条目,你就完成了。

缺点是:没有类型检查,例如,您不能安全地假设您想要配置的号码确实是一个数字 - 有人可以在该设置中放入一个字符串.....您只需访问它ConfigurationManager["(key)"],然后它就可以了让你知道你在处理什么。

此外,随着时间的推移,<appSettings>如果您的应用程序的许多部分开始在其中放入东西(还记得旧的 windows.ini 文件吗?:-)),它会变得相当复杂和混乱。

如果可以的话,我更喜欢并推荐使用您自己的配置部分 - 使用 .NET 2.0,它真的变得非常容易,这样,您可以:

  • a)在代码中定义您的配置设置,并使其类型安全并检查
  • b) 您可以将的设置与其他人的设置完全分开。你也可以重用你的配置代码!

有一系列非常好的文章可以揭开 CodeProject 上的 .NET 2.0 配置系统的神秘面纱:

  1. 揭开 .NET 2.0 配置的奥秘

  2. 解读 .NET 2.0 配置的奥秘

  3. 破解 .NET 2.0 配置的奥秘

强烈推荐!Jon Rista 很好地解释了 .NET 2.0 中的配置系统。

于 2009-01-28T06:31:51.843 回答
20

应用程序设置可以由设计器控制(通常有一个 Settings.settings 文件,默认情况下),因此更容易修改,您可以通过设置类以编程方式访问它们,它们看起来像一个强类型属性。您还可以拥有应用程序和用户级别设置,以及回滚的默认设置。

这可以从 .NET 2.0 开始使用,并且不推荐使用其他方式(据我所知)。

更多详细信息请参见:msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

于 2009-01-20T13:42:29.693 回答
15

要了解 中设置的优缺点建议您查看两者的技术细节。我提供了一些链接,您可以在其中找到用于处理的源代码,并在下面描述更多技术细节。app.config

让我简要总结一下我在与他们合作时所认识到的(注意:这同样适用于web.config网站/网络应用程序的文件):


.NET 中的应用程序
设置(点击上方查看源代码和技术细节)


优点

  • 它们允许存储类型化数据,包括对象类型(通过serializeAs属性)

  • 它们具有用户和应用程序范围,允许存储默认值

  • Visual Studio 的配置部分支持它们

  • 非常支持长字符串和/或带有特殊字符的数据(例如,包含双引号的嵌入式 JSON 字符串)


缺点

  • 用户设置存储在用户配置文件中的不同位置(具有神秘的路径),可能难以清理

  • 应用程序范围设置在应用程序运行时是只读的(在运行时只能更改用户范围设置)

  • 由 Visual Studio 的设置设计器构建的读/写方法代码,不是由 3rd 方工具直接提供的(有关解决方法,请参见上面的链接)


.NET
更新 中的 AppSettings:.NET Core 中的 AppSettings
(点击上方查看源代码和技术细节)


优点

  • 是“轻量级”,即易于处理

  • 应用程序运行期间的读写访问

  • 它们可以由管理员在
    Internet 信息服务 (IIS) 管理器中轻松编辑
    (功能视图 -> 应用程序设置,请注意图标的名称具有误导性,因为它只能处理 AppSettings 而不是 ApplicationSettings)


缺点

  • 仅支持字符串数据;字符串长度和特殊字符有限制

  • 他们没有用户范围

  • 它们不支持默认值

  • Visual Studio 的配置部分不直接支持


于 2016-12-05T09:29:03.953 回答
13

我一直在使用我不久前发现的一种模式,在这种模式下,您使用基本的 xml 标签,但将设置包装在静态配置类中。所以 - 一个 DIY App.Settings。

DotNetPearls 静态配置模式

如果你这样做,你可以:

  • 为不同的环境(开发、测试、产品)使用不同的配置值集
  • 为每个设置提供合理的默认值
  • 控制值的定义和实例化方式

设置起来很繁琐,但性能很好,隐藏了对键名的引用,并且是强类型的。这种模式适用于未被应用程序更改的配置,尽管您可能也可以支持更改。

配置:

<add key="machineName" value="Prod" />
<add key="anotherMachineName" value="Test" />
<add key="EnvTypeDefault" value="Dev" />

<add key="RootURLProd" value="http://domain.com/app/" />
<add key="RootURLTest" value="http://test.domain.com/app/" />
<add key="RootURLDev" value="http://localhost/app/" />

<add key="HumanReadableEnvTypeProd" value="" />
<add key="HumanReadableEnvTypeTest" value="Test Mode" />
<add key="HumanReadableEnvTypeDev" value="Development Mode" />

配置类:

using System;
using System.Collections.Generic;
using System.Web;
using WebConfig = System.Web.Configuration.WebConfigurationManager;

    public static class Config
    {
        #region Properties

        public static string EnvironmentType { get; private set; }

        public static Uri RootURL { get; private set; }

        public static string HumanReadableEnvType { get; private set; }

        #endregion

        #region CTOR

        /// <summary>
        /// Initializes all settings when the app spins up
        /// </summary>
        static Config()
        {
            // Init all settings here to prevent repeated NameValueCollection lookups
            // Can increase performance on high volume apps

            EnvironmentType =
                WebConfig.AppSettings[System.Environment.MachineName] ??
                "Dev";

            RootURL =
                new Uri(WebConfig.AppSettings["RootURL" + EnvironmentType]);

            HumanReadableEnvType =
                WebConfig.AppSettings["HumanReadableEnvType" + Config.EnvironmentType] ??
                string.Empty;
        }

        #endregion
    }
于 2011-03-08T22:01:02.480 回答
9

我喜欢使用更简单的版本来存储和访问单个值。

<appSettings>
    <add key="MyConfigKey" value="true"/>
</appSettings>

我编写了一个实用程序类,以允许默认值的类型安全方式访问值。如果未提供默认值,则会给出有用的异常消息。

您可以在此处查看/下载课程:

http://www.drewnoakes.com/code/util/app-settings-util/

于 2009-06-08T06:52:05.173 回答
1

使用 ApplicationSettings 的一大好处是当应用程序通过 ClickOnce 部署时,如本页中详细说明的那样。

基本上,如果一个设置是 User 类型并且已经从它的默认值修改,它将在更新到更新时保持修改。如果一个设置的类型是应用程序,它会在应用程序更新时被自动覆盖。

此外,在 VB.NET 中,可以通过简单地使用 My.Settings 访问 ApplicationSettings。从 GUI 的角度来看,使其成为最简单的设置组合。

于 2021-02-15T20:26:44.340 回答