请问Console.SetWindowSize(20,30)与分别设置WindowWidth、WindowHeight的区别是什么?
嘿,这个问题问到点子上了,很多人可能觉得这两种写法效果差不多,但其实细节上有不少关键区别,我给你掰扯清楚:
原子性与事件触发逻辑:
Console.SetWindowSize(20,30)是原子操作,系统只会执行一次窗口大小变更的逻辑,对应的Console.WindowResize事件也只会触发一次。而分开执行Console.WindowWidth = 20;和Console.WindowHeight = 30;的话,会触发两次独立的窗口变更,WindowResize事件也会收到两次通知——如果你的代码里监听了这个事件,两种写法的行为会完全不同。视觉体验的连贯性:
一次性调用SetWindowSize时,控制台窗口会直接跳转到20×30的目标尺寸,不会有中间状态。但分开设置的话,用户会看到窗口先调整宽度到20,再调整高度到30,会有明显的两次视觉跳动,体验上不够流畅。合法性校验与状态一致性:
SetWindowSize会先同时校验宽度和高度是否符合系统允许的范围(比如不能小于控制台的最小尺寸),只有两个参数都合法时,才会修改窗口大小;如果其中一个参数不合法,整个调用会失败,窗口大小保持原样。但分开设置的话,可能出现“半成功”的尴尬情况:比如先设置Width为合法值,生效了,然后设置Height为非法值,抛出异常,这时候窗口已经是修改后的宽度,高度却没变,导致窗口处于不符合预期的状态。底层实现的差异:
在Windows平台上,.NET底层是调用Win32 API的SetConsoleWindowInfo函数来实现窗口大小调整的。SetWindowSize会一次性把宽高参数打包传入这个API,只调用一次;而分别设置Width和Height则会调用两次这个API,每次只修改一个维度的参数。
内容的提问来源于stack exchange,提问作者Thewest123

