使用With语句而不是创建对象引用

时间:2013-06-28 03:21:06

标签: asp.net vb.net

我知道有一个有意义的变量名称是好的,但是在短暂使用对象而不是抛弃它的情况下,将它包装在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吗?您提供的方式或其他方式通常更好吗?如果是这样,为什么?

2 个答案:

答案 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使用调试器,只需用鼠标悬停在这些标识符上即可。