Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用With语句而不是创建对象引用_Asp.net_Vb.net - Fatal编程技术网

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

Asp.net 使用With语句而不是创建对象引用,asp.net,vb.net,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.Tex

我知道拥有有意义的变量名是很好的,但是在一个对象被短暂使用而不是扔掉的情况下,将其包装在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
对于sake参数,假设我知道
gvr.FindControl(“txtExample”)
将始终返回一个文本框


我更喜欢第二种方法。我是否有理由不这样使用
?您提供的任何一种方式总体上都更好吗?若然,原因为何

因为第二个和第三个方法编译为基本相同的IL,所以差异可能只是一个方便:在Visual Studio 2010中,第三个方法(但不是第二个)允许您检查
txtExample
.Text
,和
。只需将鼠标悬停在这些标识符上,即可使用调试器启用

因为第二个和第三个方法编译为基本相同的IL,所以差异可能只是方便的一个方面:在Visual Studio 2010中,第三个方法(而不是第二个)允许您检查
txtExample
.Text
,和
.Enabled
,只需将鼠标悬停在这些标识符上即可使用调试器进行调试。

我不选择上述任何一项

尽管有很多单字母变量被恶意攻击,但这仍将提供至少与带有
关键字的
相同的上下文,因此应被视为一种改进。在实践中,我可能会使用两个或三个字母的助记符。添加一个quick 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
子句处理。新的
选项推断
意味着没有类型的
Dim
行仍然是类型安全的。

尽管有很多单字母变量被恶意攻击,但这仍将提供至少与带有
关键字的
相同的上下文,因此应被视为一种改进。在实践中,我可能会使用两个或三个字母的助记符。添加一个quick 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
子句处理。新的
选项推断
意味着没有类型的
Dim
行仍然是类型安全的。

最后尝试实现此操作并收到错误:
'select'不是'System.Web.UI.WebControls.GridViewRowCollection'的成员。
显然,正确的语法是
gvExample.Rows.Cast(GridViewRow的).Select…
除非有我不熟悉的技巧。最后尝试实现此操作并收到错误:
“Select”不是“System.Web.UI.WebControls.GridViewRowCollection”的成员。
显然,正确的语法是
gvExample.Rows.Cast(GridViewRow的)。选择…
,除非有我不熟悉的技巧。