当要多次重复相同的代码时,这里有什么更好的做法?
What is better practice here when it's about to repeat same code multiple times?
我正在开发wpf应用程序,有一个部分应该重复很多次,实际上是关于打印文档,
每次当用户点击打印时,它都会被执行,所以我存储在 XML 文件中的一些信息,如打印机名称、路径等,
我想知道因为这个动作会重复很多次是不是最好把它存储到一个全局变量,并且只设置一次(例如在App.xaml
文件中Application_Startup
方法)并在我需要时随时使用它,也许它比每次从我的 XML?
读取它更快
这是一个代码示例:
XML的解决方案:
//call code below everytime user wants to print document
Printer printer = new Printer();
printer.AdressAnswer = Globals.ReadValueFromXML("answeraddress");
//ReadValueFromXML is my method which is returning value from xml and is defined below
public static string ReadValueFromXML(string nodeName)
{
try
{
XPathDocument doc = new XPathDocument("C:\ApplicationSettings.xml");
XPathNavigator nav = doc.CreateNavigator();
// Compile a standard XPath expression
XPathExpression expr;
expr = nav.Compile(@"/settings/" + nodeName);
XPathNodeIterator iterator = nav.Select(expr);
// Iterate on the node set
while (iterator.MoveNext())
{
return iterator.Current.Value;
}
return string.Empty;
}
catch
{
//do some error logging here. Leaving for you to do
return string.Empty;
}
}
全局变量的解决方案:
Printer printer = new Printer();
printer.AdressAnswer = Globals.PathToFolder;
和
Globals.PathToFolder
之前会在
中设置
private void Application_Startup(object sender, StartupEventArgs e)
{
try
{
//Call again ReadValueFromXML method but call it only once and use static variables multiple times
Globals.PathToFolder = Globals.ReadValueFromXML("answeraddress");
}
}
现在我想知道哪种解决方案更好,为什么?
当然(至少理论上)不每次都从文件中读取 XML 值会更快。这种性能优势在实践中是否真的重要是另一个问题。您需要执行性能 testing/measuring 才能找到答案。
如果这些值不会改变,您可以读取它们一次并在应用程序的生命周期内将它们存储在内存中。这实际上是内存使用和方法执行时间之间的权衡。
但是您可以例如从 class 的静态构造函数中调用一次 ReadValueFromXML
方法,其中正在读取值并将值存储在一些静态 class 中然后在 "real" 打印方法中使用。
我相信您正在寻找 App.config 和 Appsetting
这样您就可以将您的文件路径存储在您的启动项目中的 app.config 中:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="PathToFolder" value="C:\ApplicationSettings.xml" />
</appSettings>
</configuration>
并像这样在您的代码中访问它
string pathToFolder = System.Configuration.ConfigurationManager.AppSettings.Get("PathToFolder") ;
我正在开发wpf应用程序,有一个部分应该重复很多次,实际上是关于打印文档,
每次当用户点击打印时,它都会被执行,所以我存储在 XML 文件中的一些信息,如打印机名称、路径等,
我想知道因为这个动作会重复很多次是不是最好把它存储到一个全局变量,并且只设置一次(例如在App.xaml
文件中Application_Startup
方法)并在我需要时随时使用它,也许它比每次从我的 XML?
这是一个代码示例:
XML的解决方案:
//call code below everytime user wants to print document
Printer printer = new Printer();
printer.AdressAnswer = Globals.ReadValueFromXML("answeraddress");
//ReadValueFromXML is my method which is returning value from xml and is defined below
public static string ReadValueFromXML(string nodeName)
{
try
{
XPathDocument doc = new XPathDocument("C:\ApplicationSettings.xml");
XPathNavigator nav = doc.CreateNavigator();
// Compile a standard XPath expression
XPathExpression expr;
expr = nav.Compile(@"/settings/" + nodeName);
XPathNodeIterator iterator = nav.Select(expr);
// Iterate on the node set
while (iterator.MoveNext())
{
return iterator.Current.Value;
}
return string.Empty;
}
catch
{
//do some error logging here. Leaving for you to do
return string.Empty;
}
}
全局变量的解决方案:
Printer printer = new Printer();
printer.AdressAnswer = Globals.PathToFolder;
和
Globals.PathToFolder
之前会在
中设置private void Application_Startup(object sender, StartupEventArgs e)
{
try
{
//Call again ReadValueFromXML method but call it only once and use static variables multiple times
Globals.PathToFolder = Globals.ReadValueFromXML("answeraddress");
}
}
现在我想知道哪种解决方案更好,为什么?
当然(至少理论上)不每次都从文件中读取 XML 值会更快。这种性能优势在实践中是否真的重要是另一个问题。您需要执行性能 testing/measuring 才能找到答案。
如果这些值不会改变,您可以读取它们一次并在应用程序的生命周期内将它们存储在内存中。这实际上是内存使用和方法执行时间之间的权衡。
但是您可以例如从 class 的静态构造函数中调用一次 ReadValueFromXML
方法,其中正在读取值并将值存储在一些静态 class 中然后在 "real" 打印方法中使用。
我相信您正在寻找 App.config 和 Appsetting
这样您就可以将您的文件路径存储在您的启动项目中的 app.config 中:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="PathToFolder" value="C:\ApplicationSettings.xml" />
</appSettings>
</configuration>
并像这样在您的代码中访问它
string pathToFolder = System.Configuration.ConfigurationManager.AppSettings.Get("PathToFolder") ;