代码之家  ›  专栏  ›  技术社区  ›  Rachel

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

  •  2
  • Rachel  · 技术社区  · 8 年前

    我有如下代码:

    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);
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   MoustafaS    8 年前

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

    创建列表并在其中循环的开销很小,考虑到在编译器优化中,有一个步骤是对许多循环执行的,即 loop unrolling ,这将减少循环步骤,并逐行写入,而不是循环遍历所有行。

        2
  •  1
  •   Sam I am says Reinstate Monica    8 年前

    你所做的一切都很好,任何性能影响都太小,甚至连想都不敢想。

    你真正需要担心的是可读性。您所做的工作可读性很强,但您还可以利用其他语言特性使其更具可读性。

    这个 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; }
        }
    }