C# 当它';他将重复相同的代码多次?
我正在处理wpf应用程序,有一部分应该重复多次,实际上是关于打印文档, 每次用户单击“打印”时,它都会被执行,所以一些信息,如PrinterName、路径等,都存储在XML文件中, 我想知道,因为这个操作会重复很多次是否最好将它存储到一个全局变量中,并且只设置一次(例如在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
应用程序启动
方法中的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的属性中读取这些值。