Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当它';他将重复相同的代码多次?_C#_Xml_Wpf_Properties_Desktop Application - Fatal编程技术网

C# 当它';他将重复相同的代码多次?

C# 当它';他将重复相同的代码多次?,c#,xml,wpf,properties,desktop-application,C#,Xml,Wpf,Properties,Desktop Application,我正在处理wpf应用程序,有一部分应该重复多次,实际上是关于打印文档, 每次用户单击“打印”时,它都会被执行,所以一些信息,如PrinterName、路径等,都存储在XML文件中, 我想知道,因为这个操作会重复很多次是否最好将它存储到一个全局变量中,并且只设置一次(例如在应用程序启动方法中的App.xaml文件中),并在需要的任何时候使用它,可能比每次从XML读取它都要快 下面是一个代码示例: 使用XML的解决方案: //call code below everytime user wants

我正在处理wpf应用程序,有一部分应该重复多次,实际上是关于打印文档, 每次用户单击“打印”时,它都会被执行,所以一些信息,如PrinterName、路径等,都存储在XML文件中, 我想知道,因为这个操作会重复很多次是否最好将它存储到一个全局变量中,并且只设置一次(例如在
应用程序启动
方法中的
App.xaml
文件中),并在需要的任何时候使用它,可能比每次从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;
具有全局变量的解决方案:

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

将以前设置为

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值(至少在理论上)更快。这一性能优势在实践中是否真正重要是另一个问题。您需要执行性能测试/测量以找出原因

如果这些值不变,您可以读取它们一次,并在应用程序的生命周期内将它们存储在内存中。这实际上是内存使用和方法执行时间之间的折衷


但是,例如,您可以从正在读取值的类的静态构造函数中调用一次
ReadValueFromXML
方法,并将值存储在某个静态类中,然后在“real”打印方法中使用。

我相信您正在查找App.config和

这样,您就可以在启动项目的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>

当每一个请求都有需要做的事情时,每一个请求都要做。否则只做一次并保存。但如果这真的对性能不利呢?我们不知道,你可以测量它。@HimBromBeere我只是想知道,从每个请求的全局变量中读取值,或者从XML文件中读取值,或者从内存中读取值更好(全局变量更快)?首先:C#中没有全局变量,每个变量都绑定到一个类(但不一定要绑定到一个类的实例). 第二:实际的问题不是你想要一个静态变量还是非静态变量,而是你想要读取每个请求的值,如果值在两个请求之间不改变,这是过时的,不是吗?因此,只需阅读一次(例如,在应用程序启动时),并在每个请求中使用它。您是否可以编辑您的答案,并举例说明其可能的外观,假设存在allready公共静态类Globals,并且有一个名为which your want的属性,让我们看看它在实践中应该是什么样子,并且一旦加载,它将不会被更改,它实际上是打印机名称和文档所在文件夹的路径:)你是什么意思?您可以像前面一样在static方法中读取值,并设置Globals的属性。在“print”方法中,您不从文件中读取这些值,而是从Globals的属性中读取这些值。