在开发.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>
答案 0 :(得分:144)
基本的<appSettings>
更容易处理 - 只需点击<add key="...." value="..." />
条目即可完成。
缺点是:没有类型检查,例如你不能安全地假设你想要配置的号码确实有一个数字 - 有人可以在该设置中输入一个字符串.....你只需要访问它ConfigurationManager["(key)"]
然后你就可以知道你是什么了正在处理。
此外,随着时间的推移,<appSettings>
可能会变得相当复杂和混乱,如果你的应用程序的很多部分开始把东西放在那里(记住旧的windows.ini文件?: - ))。
如果可以,我更愿意并建议使用您自己的配置部分 - 使用.NET 2.0,它真的变得非常简单,这样,您可以:
有一系列非常好的文章可以揭开CodeProject上的.NET 2.0配置系统的神秘面纱:
强烈推荐! Jon Rista在.NET 2.0中解释配置系统做得很好。
答案 1 :(得分:20)
应用程序设置可以从设计器控制(默认情况下通常有一个Settings.settings文件),因此更容易修改,您可以通过Settings类以编程方式访问它们,它们看起来像一个强类型属性。您还可以拥有应用程序和用户级别设置,以及回滚的默认设置。
这可以从.NET 2.0开始提供,并且不赞成采用其他方式(据我所知)。
答案 2 :(得分:14)
我一直在使用我发现的模式,你在那里使用基本的xml标签,但将设置包装在静态配置类中。所以 - 一个DIY App.Settings。
DotNetPearls Static Config Pattern
如果你这样做,你可以:
设置但执行良好,隐藏对密钥名称的引用,并且是强类型的,这很繁琐。这种模式适用于未被应用程序更改的配置,尽管您也可以支持更改。
配置:
<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
}
答案 3 :(得分:9)
我喜欢使用更简单的版本来存储和访问单个值。
<appSettings>
<add key="MyConfigKey" value="true"/>
</appSettings>
我编写了一个实用程序类,以类型安全的方式访问值,允许使用默认值。如果未提供默认值,则会给出有用的异常消息。
您可以在此处查看/下载课程:
答案 4 :(得分:0)
使用 ApplicationSettings 的一大好处是当应用程序通过 ClickOnce 部署时,如 this page 中详细说明的那样。
基本上,如果设置的类型为 User 并且已从其默认值进行修改,则它会在每次更新时保持修改状态。如果设置为应用程序类型,则在应用程序更新时将自动覆盖该设置。
此外,在 VB.NET 中,只需使用 My.Settings 即可访问 ApplicationSettings。使其成为从 GUI 角度可用的最简单的设置。