【问题标题】:What is better practice here when it's about to repeat same code multiple times? [closed]当要多次重复相同的代码时,这里有什么更好的做法? [关闭]
【发布时间】:2017-09-29 13:51:13
【问题描述】:

我正在开发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");
    }
}

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

【问题讨论】:

  • 当每个请求都需要完成时,请在每个请求上执行。否则只做一次并存储它。但是,如果这真的对性能不利吗?我们不知道,你可以测量一下。
  • @HimBromBeere 我只是想知道在每次请求时从全局变量中读取值还是从 XML 文件中读取值更好,也许是从内存中读取(全局变量更快)?
  • 首先:C# 中没有全局变量之类的东西,每个变量都绑定到一个类(但不一定绑定到一个类的 instance)。第二:实际的问题不是你想要一个静态变量还是非静态变量,而是如果你想读取每个请求的值,如果值在请求之间不会改变,那么这已经过时了,不是吗?所以只需读取一次(例如在应用程序启动时)并在每次请求时使用它。

标签: c# xml wpf properties desktop-application


【解决方案1】:

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

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

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

【讨论】:

  • 您可以通过示例来编辑您的答案吗实践,确实它一旦加载就不会改变,它实际上是打印机名称和文档所在文件夹的路径:)
  • 什么意思?您像以前一样在静态方法中读取值并设置 Globals 的属性。在“打印”方法中,您不是从文件中读取这些值,而是从 Globals 的属性中读取这些值。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多