Sar*_*age 9 .net performance appsettings
我正在开发一个代码库,它有很多相同的ConfigurationManager.AppSetting调用.
这听起来像是一个可能的性能问题吗?
或者因为数据非常小是微不足道而且不"昂贵"?不断返回文件获取数据,或.NET运行时缓存文件/值/调用?
如果这不是性能问题,那么它只是一种访问应用程序配置值的无组织方法,应该重新考虑是为了更清晰,更一致地实现访问设置吗?
oaz*_*bir 15
我会说它更多的是代码可维护性问题而不是性能问题.AppSettings除非您的代码试图AppSettings在运行数百次的循环中执行查找,否则简单的字典查找不会成为问题.当然这样的代码会导致性能问题.但更重要的是,您将拥有ConfigurationManager.AppSettings["MyKey"]整个代码库.你正在引入一个神奇的字符串.如果必须更改配置文件中的密钥,则必须进行彻底搜索并替换所有项目.此外,我们通常根据appSettings中存储的值做出一些决定.它并不总是直接读取并按原样使用值.有时您会根据价值做出决定.对于前者,
if (ConfigurationManager.AppSettings["DebugMode"] == "yes")
do this
else
do that
Run Code Online (Sandbox Code Playgroud)
你可能会在一百个地方重复这个逻辑.现在让我们说你需要在那里添加另一个条件:
if (ConfigurationManager.AppSettings["DebugMode"] == "yes" || ConfigurationManager.AppSettings["InternetNotAvailable"] == "yes")
do this
else
do that
Run Code Online (Sandbox Code Playgroud)
这变得混乱.你的代码开始变臭了.
所以,我总是建议我的开发团队永远不要ConfigurationManager.AppSettings在代码中的任何地方使用.使用一些静态类来读取配置值,并将所有这些决策预先转换为单个变量.对于前者,
static class ConfigHelper
{
private readonly static bool ExternalWebserviceCallAllowed = ConfiguationManager.AppSettings["DevMode"] == "false" && ConfigurationManager.AppSettings["InternetAvailable"] == "true";
}
.
.
if (ConfigHelper.ExternalWebserviceCallAllowed)
do this
else
do that
Run Code Online (Sandbox Code Playgroud)
这不仅在性能上更好,而且还具有高度可维护和可扩展的代码.