c#switch-type多案例最佳实践

时间:2016-01-07 09:33:04

标签: c# if-statement null

我有一个网格,我通过它的名称访问每个唯一的列,如下所示:

grid.Columns["SomeColumnA"]

但是,我只能设置该列的属性,如果它不是这样的那样:

if (grid.Columns["SomeColumnB"] != null) {
    grid.Columns["SomeColumnB"].Width = 100;
}

我有大约15/20个不同的列需要为各种事物设置,但它们都需要首先检查为null。它看起来有点乱,因为它是15/20 if语句。我想知道这些if语句是否是最好的方法,或者我是否可以实现其他方法来简化它并整理代码。有什么想法/建议吗?

4 个答案:

答案 0 :(得分:5)

如果您使用C#6.0,则可以使用null propagation operator.所以

if (grid.Columns["SomeColumnB"] != null) {
    grid.Columns["SomeColumnB"].Width = 100;
}

变为

grid.Columns["SomeColumnB"]?.Width = 100;

更干净。

答案 1 :(得分:4)

我不明白为什么这些网格列可以为null。但是,也许您可​​以将列名存储在单独的集合中,并使用如下代码:

string[] columns = { "SomeColumnA", "SomeColumnB", "SomeColumnC" };
var gridColumns = columns.Select(c => grid.Columns[c]).Where(c => c != null);

foreach (var col in gridColumns)
{
    // you could use a switch if you need to set different things according to the Name
    switch (col.Name)
    {
        case "SomeColumnA": col.Width = 100; break;
        case "SomeColumnB": col.Width = 120; break;
        case "SomeColumnC": col.Width = 150; break;
        default: break;
    }
}

答案 2 :(得分:2)

你可以像这样使用所有列的循环

foreach(var column in grid.Columns)
{
    //do something to the column
}

答案 3 :(得分:0)

为什么没有设置控件属性的函数?

void SetProperty(Control ctrl,int value,string columnName)
{
    if(ctrl!=null) ctrl.Columns[columnName].Width=value; 
}

您还可以在函数签名中进行其他操作或使用可选参数,具体取决于您要设置的属性数。