【问题标题】:C# StreamWriter across methods跨方法的 C# StreamWriter
【发布时间】:2014-06-12 19:38:00
【问题描述】:

如何在一个类的各种方法中使用同一个 StreamWriter。例如。

public class XMLWriter
{       
  public export(string filename)       
  {
    StreamWriter sw = new StreamWriter(filename)
    sw.write("Line1")       
  }       

  public footer()       
  {
    // Note: I am not declaring streamwriter here since i want to use the same sw as in export method
    sw.write("Line x N")
  }                       
}

如何在多种方法中使用相同的 sw。此外,这个类将从另一个类实例化,并从那里调用“公共”方法。

我们将不胜感激。

【问题讨论】:

  • 初始添加 sw.Close(); sw.Dispose();
  • @kostasch。那怎么用其他方法暴露 sw??
  • 评论与问题无关。只是一个观察 :) 添加私有 StreamWriter sw;并在方法中对其进行初始化。
  • 谁对这个帖子投了反对票,如果他们认为他们是超级聪明,请站出来提供解决方案!
  • 您已经找到了解决方案。看看ZoolWay的答案。并处置那个流作家。

标签: c# streamwriter xmlwriter


【解决方案1】:

sw 声明为全局变量,并且仅在您处置您的XMLWriter 对象(或者当您知道您不会在文件中写入更多内容时)通过调用下面的DisposeWriter() 方法来关闭并处置它您创建该对象的类:

public class MyClass
{
    private void DoSomeStuff()
    {
        XMLWriter xmlwr = new XMLWriter();
        xmlwr.export(@"C:\YourFile.txt");
        xmlwr.footer();
        xmlwr.DisposeWriter();
        wmlwr = null;
    }
}

public class XMLWriter
    {       
        private StreamWriter sw;

        public XMLWriter()
        {
            //this is the constructor, what you call with "new XMLWriter()"
        }

        public void export(string filename)       
        {
            sw = new StreamWriter(filename)
            sw.write("Line1")     
        }       

        public void footer()       
        {
            sw.write("Line x N")
        } 

        public void DisposeWriter()
        {
            sw.Close();
            sw.Dispose();
        }            
    }

【讨论】:

    【解决方案2】:

    我会在方法(全局变量)之上声明你的 Steamwriter 并在方法内完成工作

    【讨论】:

      【解决方案3】:

      将其作为参数传递或使用私有字段 - 取决于您的要求。

      【讨论】:

        【解决方案4】:
        using System;
        using System.IO;
        using System.Text;
        
        public class XMLWriter
        {
            //Objs
            private StreamWriter sw;
            private StringBuilder sb;
            //static items
            private string strHeader;
            private string strFooter;
        
            public XMLWriter()
            {
                //this is the constructor, what you call with "new XMLWriter()"
            }
        
            public void export(string filename)       
            {
                sb = new StringBuilder();
                sw = new StreamWriter(filename);
                sw.Write(strHeader + sb.ToString() + strFooter);
                sw.Close();
                sw.Dispose();
            }
        
            public string Footer
            {
                set
                {
                    strFooter = value;
                }
            }
        
            public string Header
            {
                set
                {
                    strHeader = value;
                }
            }
        
            public string LinesAdd
            {
                set
                {
                    sb.Append(value);
                }
            }
        
        }
        

        【讨论】:

        • 参考?为什么? ref 几乎从不需要。
        • 问题是我正在创建一个 XML 类,它将创建一个 XML 输出文件。其中初始页眉和页脚将是静态的。但是行/列的实际数据将是动态的。所以这些值必须单独传递。简而言之,首先 sw 将使用 sw 转储文件中的所有标题,然后另一个类将传递必须写入文件的列/行,最后将静态页脚写入文件。如果您知道任何更好的流程,请提出建议。
        • 如果Zoolway想要使用同一个对象,而不是副本if,那么他必须使用ref。正如他所问的,使用您的方法不会在函数调用之间保留更改。还有,如果他真的选择不关闭就使用stream writer,也会出现文件锁定问题。
        • 我们在谈论多少数据?
        • 如果我们没有太多数据,我会把它放在一个字符串生成器中,然后一次性写出来。也应该快得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 2018-10-22
        • 2017-04-03
        • 2013-05-07
        • 2014-02-09
        • 2016-02-03
        • 1970-01-01
        相关资源
        最近更新 更多