我知道有一个有意义的变量名称是好的,但是在短暂使用对象而不是抛弃它的情况下,将它包装在With语句中似乎是合理的。
考虑循环访问Gridview的行以查找控件并更新它的示例情况。
For Each gvr as GridViewRow in gvExample.Rows
Dim txtExample as Textbox
txtExample = DirectCast(gvr.FindControl("txtExample"),Textbox)
txtExample.Text = "hi"
txtExample.Enabled = False
'... more with same object
next
这可以使用With编写,而不需要创建局部变量:
For each gvr as GridViewRow in gvExample.Rows
With DirectCast(gvr.FindControl("txtExample"),Textbox)
.Text = "hi"
.Enabled = False
'... more with same object
End With
next
显然,还有以下方面的妥协:
For Each gvr as GridViewRow in gvExample.Rows
Dim txtExample as Textbox
txtExample = DirectCast(gvr.FindControl("txtExample"),Textbox)
With txtExample
.Text = "hi"
.Enabled = False
'... more with same object
End With
next
为了便于论证,我们假设我知道gvr.FindControl("txtExample")
将始终返回文本框。
我偏爱第二种方法。我有理由避免以这种方式使用With
吗?您提供的方式或其他方式通常更好吗?如果是这样,为什么?
答案 0 :(得分:3)
我不选择以上任何一种。
尽管单字母变量受到诽谤,但仍然会提供与With
关键字一样多的上下文,因此应该被视为一种改进。在实践中,我可能会在这里使用两到三个字母的助记符。添加一个快速Select()linq投影,结果如下:
Dim boxes = gvExample.Rows.Cast(Of GridViewRow).Select(Function(gvr) gvr.FindControl("txtExample"))
For Each e as TextBox in boxes
e.Text = "hi"
e.Enabled = False
'... more with same object
Next
不需要DirectCast()运算符:As TextBox
子句负责处理它。新的Option Infer
表示没有类型的Dim
行仍然是类型安全的。
答案 1 :(得分:1)
因为第二种和第三种方法编译为基本相同的IL,所以差异可能只是方便之一:在Visual Studio 2010中,第三种方法(但不是第二种方法)允许您检查txtExample
,{{ 1}}和.Text
使用调试器,只需用鼠标悬停在这些标识符上即可。