Streamクラスにはヌルオブジェクトを取得するプロパティStream.Nullが用意されています。 Stream.Nullは、NULLデバイス(nul・/dev/null)の代わりとして使ったり、テスト時に具体的なStreamを用意する代わりにモックとして使用したりすることができます。
Stream.Nullは読み込み・書き込み・シークなど全ての機能をサポートしますが、実際にそれらの操作を行なっても何も起こりません。 Stream.Nullに対してWriteメソッドで書き込んだ内容はすべて破棄され、ReadメソッドでStream.Nullから読み込みを行った場合は0バイトのデータが読み出されます。 Stream.Nullの長さ(Length)は常に0です。
次の例では、出力先をStream.Nullに設定したStreamWriterをConsole.SetOutメソッド渡すことによって標準出力の出力先をコンソールからStream.Nullに変更(リダイレクト)し、Console.WriteLineメソッドで出力される内容を破棄しています。
Stream.Nullを使ってConsole.WriteLineメソッドで出力される内容を破棄する
using System;
using System.IO;
class Sample {
static void Main(string[] args)
{
foreach (var arg in args) {
// オプションスイッチ/quietが指定された場合は、標準出力へのメッセージ出力を抑止する
if (arg == "/quiet") {
// 標準出力の出力先をStream.Nullに設定したStreamWriterに変更する
Console.SetOut(new StreamWriter(Stream.Null));
// 次のようにTextWriter.Nullを使うことも可能
// Console.SetOut(TextWriter.Null);
}
}
// 警告メッセージを標準出力に出力
Console.WriteLine("warning");
// 致命的なエラーメッセージを標準エラーに出力
Console.Error.WriteLine("FATAL ERROR");
}
}
実行結果
D:\test> Sample.exe warning FATAL ERROR D:\test> Sample.exe /quiet FATAL ERROR
標準出力のリダイレクトについては自プロセスの標準入出力 §.標準ストリームのリダイレクトで詳しく解説しています。