Console.IsOutputRedirected调用SetOut后未变化,是预期行为还是Bug?
这是预期行为,而非Bug
原因说明
Console.IsOutputRedirected的判断逻辑并非基于Console.Out是否被替换为自定义TextWriter,而是检查操作系统级别的标准输出流是否被重定向:
- 只有当输出被操作系统层面的方式重定向时(比如命令行执行程序时使用
> output.txt、管道传递等),该属性才会返回True。 - 调用
Console.SetOut仅仅是替换了控制台用于写入文本的TextWriter实例,并没有改变底层进程的标准输出流句柄状态,因此IsOutputRedirected依然会返回False。
代码验证
如果想要让IsOutputRedirected返回True,需要通过操作系统级别的重定向操作。例如在命令行执行你的程序时:
your-program.exe > output.txt
此时程序中的b1会输出True,因为标准输出流已经被系统重定向到文件。
替代方案
如果需要检测Console.Out是否被替换为自定义的写入器,可以自行维护状态标记,或者对比当前Console.Out与初始的默认实例:
// 保存初始的Console.Out实例 var originalOut = Console.Out; var b1 = Console.Out == originalOut; // True Console.SetOut(new StringWriter()); var b2 = Console.Out == originalOut; // False Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }); var b3 = Console.Out == originalOut; // False(此处创建了新的StreamWriter,并非原实例) Console.WriteLine(b1); Console.WriteLine(b2); Console.WriteLine(b3);
内容的提问来源于stack exchange,提问作者Guillermo-Santos
相关产品推荐
相关产品推荐

