可以使用配置节避免以上两个问题。配置节是一个配置参数的集合。每一个参数要么定义在应用程序级,要么定义在执行该应用程序的Windows用户级。因此可以简单的使用该机制保存每个用户的偏好。
下面的配置文件定义了一个MySettings 的配置节,该节包含了一个名为MyIntUser的用户配置参数与一个名为MyIntApp的应用程序配置参数。
Myapp.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration
xmlns=>
<configSections>
<sectionGroup name="userSettings"
type="system.configuration.userSettingsGroup,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089">
<section name="MySettings"
type="System.Configuration.ClientSettingSection,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
allowExeDefinition="MachineToLocalUser" />
</sectionGroup>
<sectionGroup name="applicationSettings"
type="System.Configuration.ClientSettingSection,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
allowExeDefinition="MachineToLocalUser" />
<section name="MySettings"
type="System.Configuration.ClientSettingSection,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
allowExeDefinition="MachineToLocalUser" />
</sectionGroup>
</configSections>
<userSettings>
<MySetting>
<setting name="MyIntUr" serializaAs="String"><value>1234</value>
</setting>
</MySetting>
<userSettings>
<applicationSettings>
<mySetting>
<setting name="MyIntApp" serializaAs="String">
<value>4321</value>
</setting>
</mySetting>
</applicationSettings>
</configuration>
下面是相应的Myapp应用程序代码。我们可以看到,通过引入一个名为MySettings的System。Configuration.ApplicationSettingsBasexu继承类,前一个例子中的两个问题得到解决。我们将这样的一个类称为配置节句柄。该类为每个参数提供一个属性。与用户参数相关的属性被标上了UserScopedSettingAttribute,而与应用程序参数相关的属性被标上了ApplicationScopedSettingAttribugte.我们注意到MyIntApp属性并没有Set访问器。事实上,在这种技术中应用程序参数被视为只读的。
例:
using System.Configuration;
class Program{
static void main()
{
Mysettings mySettings=new MySecttings();
int MyIntUsr=mySetting.MyIntUsr;
System.ConsoleWriteLine(myIntUsr);
myIntUsr*=10;
mySettings.MyIntUsr=myIntUsr;
mySettings.Save();
System.Console.WriteLine(mySettings.MyIntApp);
}
}
class MySettings :ApplicationSettingsBase
{
[UserScopedSetting()]
public int MyIntUsr
{
get{ return (int)(this["MyIntUsr"]); }
set{ this["MyIntUsr"]=value; }
}
[ApplicationScopedSetting()]
public int MyIntApp
{
get { return (int) (this["MyIntApp"]); }
}
}