2

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

4

2 回答 2

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没有类型的行仍然是类型安全的。

于 2013-06-28T04:14:59.047 回答
1

因为第二种和第三种方法编译为基本相同的 IL,所以区别可能只是一种方便:在 Visual Studio 2010 中,第三种方法(但不是第二种方法)让您只需将鼠标悬停在调试器上即可检查txtExample.Text.Enabled用鼠标识别。

于 2013-06-28T04:06:25.400 回答