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