Elle obtient mis en cache, lors du premier accès à un bien, afin de ne pas lire à partir du fichier physique chaque fois que vous demandez une valeur. C'est pourquoi il est nécessaire de redémarrer une application Windows (ou d'Actualisation de la configuration) pour obtenir la dernière valeur, et pourquoi une ASP.Net application redémarre automatiquement lorsque vous modifiez le web.config. Pourquoi ASP.Net est câblé pour redémarrer est discuté dans les références dans la réponse Comment éviter les ASP.NET redémarrage de l'application lorsque le web.la config est modifié.
Nous pouvons le vérifier à l'aide de ILSpy et à la recherche sur le fonctionnement interne du Système.Configuration:
public static NameValueCollection AppSettings
{
get
{
object section = ConfigurationManager.GetSection("appSettings");
if (section == null || !(section is NameValueCollection))
{
throw new ConfigurationErrorsException(SR.GetString("Config_appsettings_declaration_invalid"));
}
return (NameValueCollection)section;
}
}
Au premier abord, cela semble en effet comme il obtiendra la section à chaque fois. En regardant GetSection:
public static object GetSection(string sectionName)
{
if (string.IsNullOrEmpty(sectionName))
{
return null;
}
ConfigurationManager.PrepareConfigSystem();
return ConfigurationManager.s_configSystem.GetSection(sectionName);
}
L'essentiel ici est l' PrepareConfigSystem()
méthode; ce initialise une instance de l' IInternalConfigSystem
domaine détenus par le ConfigurationManager - le type de béton est ClientConfigurationSystem
Dans le cadre de cette charge, une instance de la Configuration de la classe est instanciée. Cette classe est effectivement un objet de représentation du fichier de config, et semble être tenu par le ClientConfigurationSystem de ClientConfigurationHost propriété dans un champ statique - d'où il est mis en cache.
Vous avez pu tester empiriquement en procédant de la manière suivante (dans un Formulaire Windows ou une application WPF):
- Départ de votre Application
- Accéder à une valeur dans l'app.config
- Faites un changement à l'application.config
- Vérifiez pour voir si la nouvelle valeur est présente
- Appelez
ConfigurationManager.RefreshSection("appSettings")
- Vérifiez pour voir si la nouvelle valeur est présente.
En fait, j'aurais pu éviter quelques temps, si je venais de lire le commentaire sur le RefreshSection méthode :-)
/// <summary>Refreshes the named section so the next time that it is retrieved it will be re-read from disk.</summary>
/// <param name="sectionName">The configuration section name or the configuration path and section name of the section to refresh.</param>