本篇博客將介紹C#中Settings的使用。參考:https://docs.microsoft.com/zh-cn/visualstudio/ide/managing-application-settings-dotnet?view=vs-2017
首先介紹一個桌面程序中的例子,當我們新安裝一個軟件,軟件啟動后會有例如新手指導等窗體彈出來,每次都需要自己去關閉它。當然這些軟件都會提供例如不再顯示等功能。當選擇不再顯示功能后,這些窗體以后再也不顯示了。
對於這些設置,可以采用下面的一些方法來存儲,自定義XML文件,注冊表,當然還可以是C#中自帶的Settings文件。推薦使用Settings文件。注冊表輕易不要使用,自定義XML在使用時需要解析,可以當備選方案。
下面通過一個例子來展示,
新建一個WPF項目,

藍色背景的便是Settings,

一個Setting有4個屬性Name,Type,Scope,Value。重點講一下Scope屬性,Scope屬性有兩個值Application,User。這兩者區別,Scope值為Application時,對應的Setting在運行時不可以修改。Scope值為User時,對應的Setting在運行時可以修改。
Setting保存位置:當程序編譯后,Setting的值保存在<AssemblyName>.exe.config文件中,例如:

在程序中使用Setting,
// Modify the setting value
Properties.Settings.Default.DisplayGuide = false;
// Save setting value
Properties.Settings.Default.Save();
其中,Settings里的屬性根據范圍分為兩種 “用戶”和“應用程序”(其中:應用程序級配置是只讀的,而用戶級是可讀寫的。)
范圍為“應用程序”的屬性,讀取都是從APP.CONFIG里獲取,設置也可以通過手工修改App.config改變,但是在程序中無法對其進行賦值,只能讀取。
而范圍為“用戶”的屬性 Settings 在第一次運行時會讀取App.config里的初始值
但是一旦調用Save方法后,Settings里“用戶”范圍的屬性就會保存在系統里面,類似WebForm里的Cookies一樣
從此以后,讀取都會從系統里保存的值里讀取,手工修改App.config里的“用戶”范圍的屬性不會影響到這些屬性,但是在調用Reset方法時會從新從App.config里獲取“用戶”范圍的屬性寫入到系統中。
也就是說,settings里“用戶”范圍的屬性總共有3個地方存儲。
1、app.config配置文件-----程序第一次運行,之前程序未調用save(),在系統中找不到就會從這里獲取
2、操作系統--------當settings調用save()保存后。
3、內存----程序啟動后,實例化settings對象,該實例在創建的時候從系統(如果系統中沒有就如前面提到的從配置文件中獲取)讀取在內存中。
一旦我們通過VC#給它添加值后,在工程目錄下會生成一個 app.config 文件。
那么,這兩個東西究竟是什么關系?
添加兩個字符串類型的配置值(一個應用程序級,一個是用戶級)后:
- Settings.settings
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="WpfApplication1.Properties" GeneratedClassName="Settings"> <Profiles /> <Settings> <Setting Name="thisIsAppSettings" Type="System.String" Scope="Application"> <Value Profile="(Default)">dbzhang800</Value> </Setting> <Setting Name="thisIsUserSettings" Type="System.String" Scope="User"> <Value Profile="(Default)">1+1=2</Value> </Setting> </Settings> </SettingsFile>
- app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="WpfApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="WpfApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <userSettings> <WpfApplication1.Properties.Settings> <setting name="thisIsUserSettings" serializeAs="String"> <value>1+1=2</value> </setting> </WpfApplication1.Properties.Settings> </userSettings> <applicationSettings> <WpfApplication1.Properties.Settings> <setting name="thisIsAppSettings" serializeAs="String"> <value>dbzhang800</value> </setting> </WpfApplication1.Properties.Settings> </applicationSettings> </configuration>
盡管都是 xml 文件,兩個文件的風格截然不同,后者 app.config 就是我們前一篇中介紹到了 Configuration 文件,從它的configSections中可以看出它有兩個自定義段,分別叫applicationSettings 和 userSettings
操作這樣的一個文件,我們可以創建ConfigurationManager命名空間中的ConfigurationSection的派生類,然后通過該類進行操作。
Settings.settings 看起來相當的簡潔,而且和app.config相比,它包含有配置值的類型(比如:Type="System.String")。
而且,無論我們修改Settings.settings還是app.config,Visual studio都會提示我們,並自動同步到另一個文件中。
- Settings.settings 文件的存在的目的是為了生成一個名為 Settings.Designer.cs 的文件,該文件內的類提供了操作配置文件 (比如:program.exe.config) 的封裝類。
- app.config 會被拷貝到應用程序目錄下,並變身為 program.exe.config
這樣一來,在程序內就可以通過
Properties.Settings.Default.thisIsUserSettings = "999999999";
console.WriteLine(Properties.Settings.Default.thisIsAppSettings); Properties.Settings.Default.Save();
來操作配置文件了。
用戶配置會被寫入到
C:\Users\Administrator\AppData\Local\“項目名稱”\WPFUserSetting.exe_Url_v4wjaifsqnskfnd0x5zhrlngptsdqoii\1.0.0.0\user.config
這些文件中。
多個.settings文件
同一個工程中,可以添加多個 .settings 文件,每一個都會生成一個封裝類,各對 app.config 中的一部分進行操作。
