【问题标题】:Global streamreader and streamwriter? How to properly use "using"全球流媒体阅读器和流媒体作家?如何正确使用“使用”
【发布时间】:2014-04-23 05:35:08
【问题描述】:

来自 C/C++,我习惯于使用指针来处理我的大部分操作,但是我理解在使用 streamreader/streamwriter 时使用“using”语句的重要性。

但是我面临一个特殊的问题,因为我有一个方法/函数可以打开/声明流读取器/流写入器,而我还有另一种方法/函数可以实际读取/写入流。但是“using”语句只是本地的,所以我无法在执行实际读/写的函数中正确使用“using”语句。 streamreader/streamwrite 是在类定义中定义的,只有类本身可以访问。这两个方法都是类函数。

这可能是一个非常新手的问题,但我在网上找不到任何有用的东西。谢谢。

【问题讨论】:

  • 这就是 StreamReader/Writer 也有 Close() 方法的原因。
  • 实现 IDisposable 并让您班级的消费者使用 using
  • 提供方便的语法,确保正确使用 IDisposable 对象。 msdn.microsoft.com/en-us/library/yh598w02.aspx

标签: c# using streamreader streamwriter


【解决方案1】:

好吧,如果您需要在创建它的范围之外返回IDisposable 对象,您可以这样做,前提是一旦不再使用它,某处的某些其他代码会在其上调用.Dispose()

但是,要获得更完整的答案,您应该发布一些代码。重构可能有助于完全避免该问题。

【讨论】:

  • 我在类定义中定义了 StreamWriter writename,然后我有一个函数: private bool Create_Writer(String filename, ref StreamWriter writername) { writename = new StreamWriter(filename, false);然后我有另一个函数叫做: Private void Write_stuff() { if(writename!=null) { //write stuff } } 那么如果我只在用户点击后将内容写入文件,那么处理对象的正确方法是什么路由到调用 Write_stuff 的事件处理程序 User_Click_Button 的按钮?
  • 另外,类在特定“屏幕”退出时会自动销毁,作为类的一部分,streamwriter 和 reader 在类销毁时也会被销毁吗?谢谢
  • 不,如果一次性对象是类的成员,在析构函数上销毁有点太晚了(不能保证什么时候会被调用),这意味着你的类引用了你的一次性也必须标记为IDisposable
  • 我明白了。如果我确切知道何时为流读取器和流写入器调用 Dispose() 会怎样? (我知道一旦我写完,我就可以处理这些东西了。)
  • @user2584960 是的,您不需要使用using。您当然可以自己致电Dispose()using 只是让它变得更容易,并且 using 可以保证 dispose 将被调用(即使发生异常并且堆栈已展开)。当您需要自己做时,肯定有有效的情况。一个简单的例子是SqlConnection.CreateCommand(),其中微软正在创建一次性SqlCommand实例并返回给调用者(因此using没有完成),调用者负责调用dispose(调用者可以使用using或直接调用通过Dispose())
【解决方案2】:

using() { ... } 只是在作用域结束时调用.Dispose() 的一种便捷方式。
您不必总是使用using() { ... }。您可能希望明确处理对象的生命周期。

【讨论】:

  • 我在类定义中定义了 StreamWriter writename,然后我有一个函数: private bool Create_Writer(String filename, ref StreamWriter writername) { writename = new StreamWriter(filename, false);然后我有另一个函数叫做: Private void Write_stuff() { if(writename!=null) { //write stuff } } 那么如果我只在用户点击后将内容写入文件,那么处理对象的正确方法是什么路由到调用 Write_stuff 的事件处理程序 User_Click_Button 的按钮?谢谢
  • 对不起,我不擅长使用格式化功能...@AlfredBr
  • @user2584960 问题,为什么你在实际使用它之前就创建了 write ?您可以将编写器的创建推迟到调用 User_Click_Button 之前吗?
  • 这是因为我将旧版软件移植到 C 中。在旧版程序中,用户将选择一个选项并创建和分配文件描述符,然后向用户显示信息。然后用户确认,然后写入器继续写入。我似乎没有找到绕过它的方法,因为必须在用户选择一个选项后立即显示信息。该信息基于文件描述符创建结果的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2011-07-03
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多