创建一个控件列表只是为了在foreach中而不是在多行上设置一些共享属性,可以吗
本文关键字:设置 共享 属性 foreach 一个 控件 列表 创建 | 更新日期: 2023-09-27 17:59:12
我有这样的代码:
if (someCondition)
{
control1.Enabled = true;
control1.BackColor = Colors.CornSilk;
control2.Enabled = true;
control2.BackColor = Colors.CornSilk;
control3.Enabled = true;
control3.BackColor = Colors.CornSilk;
...
}
else
{
control1.Enabled = false;
control1.BackColor = default(Color);
control2.Enabled = false;
control2.BackColor = default(Color);
control3.Enabled = false;
control3.BackColor = default(Color);
...
}
为这些控件创建一个列表,并使用循环,在内存或性能方面有什么缺点吗?
var requiredControls = new List<Control>() { control1, control2, control3, .. };
if (someCondition)
{
foreach(var c in requiredControls)
{
c.Enabled = true;
c.BackColor = Colors.CornSilk;
}
}
else
{
foreach(var c in requiredControls)
{
c.Enabled = false;
c.BackColor = default(Color);
}
}
甚至
var requiredControls = new List<Control>() { control1, control2, control3, .. };
foreach(var c in requiredControls)
{
c.Enabled = someCondition;
c.BackColor = (someCondition ? Colors.CornSilk : default(Color);
}
如果您谈论的是原始性能差异,那么第一个是性能最好的,但是,正如所有评论和答案中所提到的,在这种特定情况下,差异可以忽略不计。
较小的开销将是创建列表并在其中循环,考虑到在编译器优化中,有一个步骤要对许多循环执行,即loop unrolling
,这将减少循环步骤,并逐个写入行,而不是在所有循环中循环。
您所做的一切都很好,任何性能打击都太小,根本无法考虑。
您真正需要担心的是可读性。您所做的内容可读性很强,但您还可以使用其他语言功能使其更具可读性。
params
关键字是一个可以使用的工具。这是一个演示。
public class Program
{
public static void Main(string[] args)
{
var foo1 = new Foo() { Bar = 1 };
var foo2 = new Foo() { Bar = 2 };
AddOne(foo1, foo2);
}
public static void AddOne(params Foo[] foos)
{
foreach(var foo in foos)
{
foo.Bar++;
}
}
public class Foo
{
public int Bar { get; set; }
}
}