当它要重复多次重复相同的代码时,这里有什么更好的做法?

时间:2017-09-29 13:51:14

标签: c# xml wpf properties desktop-application

我正在开发wpf应用程序,有一部分应该重复多次,实际上是关于打印文档, 每当用户点击打印时,它都会被执行,因此一些信息如PrinterName,Paths等我存储在XML文件中, 我想知道因为这个动作会重复多次最好将它存储到全局变量中,并且只设置一次(例如App.xaml文件中{ {1}}方法)并在我需要的任何时候使用它,也许它比每次从我的XML读取它更快?

这是一个代码示例:

使用XML的解决方案:

Application_Startup

全局变量解决方案:

//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

现在我想知道哪种解决方案更好,为什么?

2 个答案:

答案 0 :(得分:1)

当然,(至少在理论上)每次都不能从文件中读取XML值。这种性能优势在实践中是否真正重要是另一个问题。您需要执行性能测试/测量才能找到答案。

如果值不会改变,您可以阅读它们一次,并在应用程序的生命周期内将它们存储在内存中。它是内存使用和方法执行时间之间的权衡。

但是你可以从正在读取值的类的静态构造函数中调用ReadValueFromXML方法一次,并将valuess存储在某个静态类中,然后在" real& #34;打印方法。

答案 1 :(得分:0)

我相信你正在寻找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") ;