C# 打开/关闭控制台输出

标签 c# console console-application

我正在制作一个使用 SharpPcap 分析网络流量的 C# DLL。我想要实现的功能之一是可切换的控制台输出。这个想法是在我的类中有一个方法

public void ConsoleOutputOn(bool outputOn)

如果需要控制台输出则接收 true,否则接收 false。我不知道如何实现。

在 LUA 中我可以写

local dprint2 = function() end
function consoleOutput(outputOn)
  if (outputON == true) then
    dprint2 = function(...)
      print(...)
    end
  else
    dprint2 = function() end
  end
end

如果调用 consoleOutput(true),dprint2 将变为打印,并且每次调用 dprint2 时,输入参数将传递给打印并打印在控制台输出上。如果调用了 consoleOutput(false),那么 dprint2 将是一个什么都不做的空函数。

我试图在 C# 中做同样的事情,我的类将有私有(private)变量“consoleOn”,而不是打印我会调用

public void ConsoleOuptput(...) {
  if(outputOn) {
    Console.WriteLine(...);
  }
} 

这将检查“consoleOn”是否为真,如果是,则将参数发送到 Console.WriteLine()。

问题是 Console.WriteLine() 对于各种输入参数重载了 19 次。是否有一种方法可以编写“如果 sonsoleOn 将所有参数传递给 Console.WriteLine()”。或者是否有更好的方法来制作可切换的控制台输出。

请记住,我正在制作 DLL。我不能完全关闭控制台。

最佳答案

我最近对此非常成功地使用了一种方法,即使用 允许为 null 的记录器实例(可能只是 TextWriter)。现在,纯粹主义者可能会认为“空对象是一种反模式”,但它允许一些很棒的用法,例如:

log?.WriteLine($"Connection from '{from}' to '{to}', {data.Length} bytes to process...");

如果 log 实例为 null,那么 基本上是免费的,这要归功于评估短路的方式。当然,Console.Out 是一个 TextWriter,所以如果您想启用控制台日志记录:

myApp.Log = Console.Out;

但同样,您可以记录到文件、网络套接字或其他任何内容 - 只需更改分配给 myApp.Log 的内容即可。如果它是 null:记录就会停止。

关于C# 打开/关闭控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39535876/

相关文章:

c# - 如何从 Word 文档中获取主题和标题(无需打开)?

c# - 将并发字典传递给另一个方法

c# - 我的 Controller 方法是异步执行的吗?

java - 如何处理java system.console()返回null

c# - 检查子重复项

c# - 为什么使用两个任务执行两个长计算会降低性能?

python - 在 python 中创建控制台

java - 为基于控制台的应用程序创建控制台的最佳实践

c# - 如何在多线程控制台中保留一行用于输入?

c# - 带有超链接的 .net 控制台应用程序?