.NET - 为什么只配置在单元测试中允许的标准输出? [英] .NET - Why is disposing of standard output only allowed during unit tests?

查看:147
本文介绍了.NET - 为什么只配置在单元测试中允许的标准输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我想指出的是,我真的不希望配置标准输出的......我只是想知道我为什么看到所描述的行为。我没有写坏code描述。

First of all, I want to point out that I do not really want to dispose of the standard output...I just want to know why I'm seeing the described behavior. I didn't write the bad code described.

我使用.NET 4的单元测试,并为code正在测试.NET 3.5。我使用MSTest的用于.NET 4为我的测试框架。

I'm using .NET 4 for the unit tests and .NET 3.5 for the code being tested. I'm using MSTest for .NET 4 as my testing framework.

最近我一直在努力与被扔,由于处置标准错误输出的错误错误的库。 (请参阅<一个href="http://stackoverflow.com/questions/12114992/libtiff-net-readdirectory-is-giving-system-objectdisposedexception-only-during-u/12117105">LibTiff.NET ReadDirectory是给System.ObjectDisposedException只在单元测试)。

Recently I have been working with a library that was throwing errors due to the blunder of disposing of the standard error output. (See LibTiff.NET ReadDirectory is giving System.ObjectDisposedException Only During Unit Tests).

这是相对他们的code看起来像:

This is relatively what their code looked like:

using (TextWriter stderr = Console.Error)
{
    ...
}

基本上,当不运行单元测试,标准的输出不设置,即使一个具体处置,但运行单元测试时,它是允许的。

Basically, when not running unit tests, the standard output is not disposed even if one specifically disposes of it, but when running unit tests, it is allowed.

任何人都可以解释为什么在单元测试的情况下?

推荐答案

这是一个释放的对象调用一个方法会抛出的ObjectDisposedException 。例如:

Calling a method on a disposed object will throw ObjectDisposedException. E.g.:

var textWriter = Console.Error;
textWriter.Dispose();
textWriter.WriteLine("Test");

最后一行应抛出异常。除了它不总是到

The last line should throw an exception. Except it doesn't always to that.

如果你仔细阅读BCL源$ C ​​$ C,你可以看到控制台或者使用的StreamWriter (真同步流作家)被挂接到一个真正的流(如控制台错误流),或者说是不提供给 StreamWriter.Null

If you peruse the BCL source code you can see that Console either uses a StreamWriter (really a synchronized stream writer) that is hooked up to either a "real" stream (e.g. the console error stream) or if that is not available to StreamWriter.Null.

真正的的StreamWriter 的结构是一种特殊的方式,以便它不是可关闭。这意味着,即使你关闭(或处置它),它只是继续正常工作。

The "real" StreamWriter is constructed in a special way so that it is not closeable. This means that even if you close it (or dispose it) it just continues to function as expected.

所以,如果你有一个真实的控制台流,你可以关闭 Console.Error 多次,只要你想,无需关闭底层流。你也不会得到任何的ObjectDisposedException

So if you have a "real" console stream you can close Console.Error as many times as you want without closing the underlying stream. Also you wont get any ObjectDisposedException.

如果有连接到 Console.Error 结束没有真正的流的StreamWriter 将关闭底层流(在这种情况下, Stream.Null )不表现出特殊的非可关闭的行为,如果你尝试使用的StreamWriter 以后你会得到一个的ObjectDisposedException

If there is no "real" stream attached to Console.Error closing the StreamWriter will close the underlying stream (in this case Stream.Null) which doesn't exhibit the special non-closeable behavior, and if you try to use the StreamWriter later you will get an ObjectDisposedException.

的底线是,你可以得到一个的ObjectDisposedException 如果您在应用程序中pmaturely关闭控制台流作家$ P $不具有真正的控制台流。

The bottom line is that you can get a ObjectDisposedException if you close a console stream writer prematurely in an application that doesn't have a real console stream.

上面还的信息适用于 Console.Out

这篇关于.NET - 为什么只配置在单元测试中允许的标准输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆