问题描述
我已经在这里查找了所有“更高效”的帖子,但没有一个直接回答这个问题,所以我需要一些聪明的头脑来帮助我。
我目前将设置存储在 app.config 中,并根据需要获取值。我用这个方法:
public static string AppConfig_Getkeyvalue(string strAppSettingKeyName)
{
ConfigurationManager.RefreshSection("appSettings");
string myAppSettingValue = ConfigurationManager.AppSettings[strAppSettingKeyName];
return myAppSettingValue;
}
问题是...如果我正在执行大量操作,例如 sql 插入或将信息写入屏幕或终端,为了速度/效率,全局存储该值是否更好?例如:
如果在每个 sql 插入,我们检查 app.config 的值:
<add key="MysqLLogging" value="true"/>
public static bool MysqLLoggingOn = bool.Parse(TTLog.AppConfig_Getkeyvalue("MysqLLogging"));
哪个更好?也许简要解释一下原因?
作为第二个示例,我为用户将内容记录到屏幕上,但如果我想要详细信息,则在每行中包含文本 DEBUG,但不想显示它,除非该模式在应用程序中为“真”。配置:
public static void DoWriteLine(string strMessage,bool blnShowDateStamp = true,ConsoleColor clrForeColor = ConsoleColor.Green,ConsoleColor clrBackColor = ConsoleColor.Black)
{
if (strMessage.ToLower().Contains("debug") && !(bool.Parse(AppConfig_Getkeyvalue("myModeDebugOn")))
return; // If app.config key is false,don't process message to the screen
Console.ForegroundColor = clrForeColor;
Console.BackgroundColor = clrBackColor;
if (blnShowDateStamp)
Console.WriteLine(("[ " + DateTime.Now.ToString("ddd MM/dd/yyyy hh:mm:ss.fff") + " ] -> " + strMessage).padright(Console.WindowWidth - 1));
else
Console.WriteLine((strMessage).padright(Console.WindowWidth - 1));
Console.ResetColor();
}
上面,很明显,对应的是app.config中的key:
<add key="myModeDebugOn" value="True"/>
然后,可能每一秒都必须处理这个:
if (strMessage.ToLower().Contains("debug") && !(bool.Parse(AppConfig_Getkeyvalue("myModeDebugOn")))
return;
那么所有这些文件读取操作的效率都低了吗?我只记得从学习编程的第一天起,永远不要使用全局变量,这很糟糕。
谢谢!
解决方法
首先不要刷新该部分,该变量已经存储在“全局”变量中。刷新会强制读取文件,这是一个 IO 操作,因此开销很大。
检查 Does ConfigurationManager.AppSettings[Key] read from the web.config file each time? 以查看 AppSettings
属性的反汇编代码。数组加载一次,然后可以通过静态属性访问。
与您自己的静态变量相同。
所以:
public static string AppConfig_GetKeyValue(string strAppSettingKeyName)
{
// ConfigurationManager.RefreshSection("appSettings");
return ConfigurationManager.AppSettings[strAppSettingKeyName];
}
几乎相当于你自己的全局静态变量。我希望差异很小,主要基于两者之间进行基准测试时的机器负载。