创建一个控件列表只是为了在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);
}

创建一个控件列表只是为了在foreach中而不是在多行上设置一些共享属性,可以吗

如果您谈论的是原始性能差异,那么第一个是性能最好的,但是,正如所有评论和答案中所提到的,在这种特定情况下,差异可以忽略不计。

较小的开销将是创建列表并在其中循环,考虑到在编译器优化中,有一个步骤要对许多循环执行,即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; }
    }
}