C# 在绘画中创建短生命对象的效率[Winforms]

C# 在绘画中创建短生命对象的效率[Winforms],c#,performance,winforms,paint,C#,Performance,Winforms,Paint,在这两者之间有什么更好的选择: protected override void OnPaint(args e) { int variable = x + y + z; e.Graphics.DrawSomething(variable, variable, variable, variable) } 或 如果有什么不同,为什么 注意:我知道在绘制事件之外使用全局变量,使用OnResize、OnMouseLeave等事件,并使用OnPaint访问它,这样做是更好的选择。但我说的只是这个案子 如果

在这两者之间有什么更好的选择:

protected override void OnPaint(args e)
{
int variable = x + y + z;
e.Graphics.DrawSomething(variable, variable, variable, variable)
}

如果有什么不同,为什么


注意:我知道在绘制事件之外使用全局变量,使用OnResize、OnMouseLeave等事件,并使用OnPaint访问它,这样做是更好的选择。但我说的只是这个案子

如果两个线程试图同时在Paint上运行,您认为会发生什么情况?代码的本地化非常重要,所以您的最后一段是错误的。如果
变量
仅与
OnPaint
相关,则应在此处声明该变量。在您的示例中,全局变量或成员变量不是首选的。这对我来说最有意义。我是个书呆子,只是想知道什么对记忆更好,因为绘画是连续进行的。在我看来,通过使用范围外的变量,您只需为该变量分配一次内存,然后根据每次更改对其进行修改。但是通过本地化,你可以为每一帧分配新的内存,让GC在一段时间后清理它。至少有2条汇编指令在堆栈上显式地为变量保留空间,因此它将非常快(初始化除外)。与所有优化一样,在尝试替代方案之前,您需要对问题进行度量。
但通过对其进行本地化,您将为每个帧分配新内存,让GC在一段时间后清理
要清楚,在代码示例的上下文中(即函数内部的
int variable=x+y+z;
),
变量
在堆栈上,而不是堆上-因此不涉及GC。总承包商无需“清理”。
int variable;

protected override void OnPaint(args e)
{
variable = x + y + z;
e.Graphics.DrawSomething(variable, variable, variable, variable)
}