c#开关型多案例最佳实践

c#开关型多案例最佳实践,c#,if-statement,null,C#,If Statement,Null,我有一个网格,通过其名称访问每个唯一的列,如下所示: grid.Columns["SomeColumnA"] 但是,我只能在该列不为null时设置其属性,如下所示: if (grid.Columns["SomeColumnB"] != null) { grid.Columns["SomeColumnB"].Width = 100; } 我有大约15/20个不同的列,需要为各种事情设置它们,但它们都需要首先检查null。它看起来有点凌乱,因为它是15/20if语句。我想知道这些语句是否

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

grid.Columns["SomeColumnA"]
但是,我只能在该列不为null时设置其属性,如下所示:

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

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

您可以像这样在所有列中使用循环

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

我不明白为什么那些网格列可以为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;
    }
}
如果使用C#6.0,则可以使用So

变成

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

更干净。

为什么不使用一个函数来设置控件的属性呢

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

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

为什么需要检查它们是否为null?这是一项安全检查,不确定如果试图访问不存在的列,它是否会引发异常,假设该列不存在??如果尝试使用
null
的内容,则在运行时总是会出现
null引用异常。但正如我在回答中所评论的,通常网格列作为单独的对象存在,您可以直接访问它们(例如作为
DataGridViewTexboxColumn
)。这样,您就可以通过编译时安全性保持可读性。因此,如果您有一个列
SomeColumnA
,那么您可以直接访问它:
this.SomeColumnA.Width=100
。无需使用
grid.Columns[“SomeColumnA”]
,您可以确保它不为null。这是否真的可以编译?这是否有效?我没有C#6,但它似乎只能用于计算表达式,而不能用于赋值。看看,尤其是暗示这是不可能的。我相当肯定这是行不通的。错误类似于“赋值的左侧必须是变量、属性或索引器”@MatthewWatson:是的,这也是文章提到的。对于道路上的任何内容都为null的情况,null传播运算符返回一个可为null的类型。但是,即使这样,仍然必须手动执行所有这些检查。Tims解决方案应该工作得最好。或者如果OP想要处理所有列(假设它适用于实际类型),只需
foreach(grid.Columns中的var col)
。@MatthewWatson:当然,但我假设OP出于某种原因使用列名,而且有时它们可以为null也是有原因的。通常,网格列甚至作为单独的对象存在,您可以直接访问这些对象(例如作为
DataGridViewTexboxColumn
)。通过这种方式,您可以保持编译时安全性的可读性。是的,我同意这一点。
void SetProperty(Control ctrl,int value,string columnName)
{
    if(ctrl!=null) ctrl.Columns[columnName].Width=value; 
}