代码之家  ›  专栏  ›  技术社区  ›  Sam

控制台应用程序中的可选输出文件-使StreamWriter全局

c#
  •  1
  • Sam  · 技术社区  · 16 年前

    我正在编写一个控制台应用程序,它正在查找有关SQL Server中的SSIS包的信息。我让它工作并写入.csv文件。我刚刚增加了为servername、foldername和outputfile传递命令行开关的功能。如果没有指定输出文件,我只想输出到控制台,我已经在做了。

    我处理文件写入的方式看起来很笨拙,可能是错误的。

    在我的主要方法中,我创建了一个流作者。我需要将程序的整个输出写到这个文件中。我通过递归调用函数来探索指定文件夹下的文件夹。

    我在所有调用中都传递streamwriter对象-它是不使用它的函数中的参数,因此它可以传递给使用它的函数。看起来我应该能够把它变成一个全局变量,但是我看到c没有全局变量,“如果你使用的是全局变量,你可能做的不对”。

    我曾计划在关闭这个小实用程序一段时间后,最终重新讨论这个问题,但现在我遇到的问题是所有函数都需要streamwriter对象——如果我将其设置为可选,那么它就不会出现在函数中。而且似乎C不做可选的参数。

    我相信你能告诉我我不是专家,只有在我需要的时候才可以涉猎。谢谢你的帮助。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Paul Sonier    16 年前

    你想用一个 singleton 模式,以引用正在使用的流作者。单例是一种“模拟”全局变量功能的方法,而不存在全局变量的问题。

    本质上,singleton提供的是一个特定于类的资源实例,您希望在应用程序的许多不同部分之间共享该资源。通过静态类实例访问资源。

    实际上,您要做的是定义一个类,该类作为公共类 静止的 为您要使用的streamwriter成员;这样,您在其余代码中使用的任何方法都可以通过从包含类访问streamwriter的同一实例(不需要创建类的实例,因为它是静态的),从而获得对该实例的访问。

        2
  •  1
  •   Henk Holterman    16 年前

    类似的东西

    public static class CsvWriter
    {
       private static StreamWriter _writer = new StreamWriter(...);
    
       public static  StreamWriter Writer 
       {
          get { return _writer; }
       }
    }
    

    有些变化是可能的,主要项目是这里的静态属性。这就像是一个全球性的,但并没有(完全)那么糟糕。

        3
  •  0
  •   David Espart    16 年前

    所有的函数都是同一类的吗?您可以创建一个类变量(字段),并从类的所有方法访问它。如果不是,则可以使用静态字段创建新的公共类。

        4
  •  0
  •   Fredrik Mörk    16 年前

    我可以用 Console.SetOut 为此:

    static void Main(string[] args)
    {
        StreamWriter writer = new StreamWriter(@"c:\path\file.ext");
        try
        {
            Console.SetOut(writer);
            Console.WriteLine("One");
            Console.WriteLine("Two");
            Console.WriteLine("Three");
        }
        catch (Exception ex)
        {
            Console.WriteLine("That went wrong.");
        }
        finally
        {
            writer.Dispose();
        }    
    }