如何在With语句中引用对象并添加至List?无需显式指定变量
在VB.NET的With语句中引用当前对象并添加到List的方案
很遗憾,VB.NET的With语句里并没有内置的方式来隐式引用当前正在操作的目标对象——没办法用你设想的[this label object]这种语法来省略变量名。不过我们有几种更简洁的替代方案,能帮你避免大量重复手动添加的麻烦:
1. 创建对象时直接添加到List(最简洁)
如果后续不需要单独引用这个控件变量,可以直接在创建对象的同时把它加入List,连中间变量都能省:
Dim myList As New List(Of Object) ' 直接创建+设置属性+加入List一步完成 myList.Add(New Label With { .Top = 50, .Left = 100, .Text = "Something" }) ' 同时添加到Panel也可以合并进去 Panel1.Controls.Add(myList(myList.Count - 1))
如果需要保留变量(比如后续要修改控件),也可以在创建后立刻添加,不用单独写一行:
Dim label1 As New Label With { .Top = 50, .Left = 100, .Text = "Something" } myList.Add(label1) Panel1.Controls.Add(label1)
2. 循环批量创建时合并操作
既然你提到有大量对象需要循环处理,这种场景下可以把创建控件、设置属性、添加到List、添加到Panel全部放在循环体内,代码会非常整洁:
Dim myList As New List(Of Object) Dim panel As New Panel() ' 比如批量创建10个标签 For i As Integer = 0 To 9 Dim newLabel As New Label With { .Top = 50 + i * 35, ' 垂直间隔排列 .Left = 100, .Text = $"标签 {i + 1}" } myList.Add(newLabel) panel.Controls.Add(newLabel) Next
3. 用With语句时的妥协方案
如果你一定要保留With语句来设置大量属性,那还是得显式写出变量名,但至少可以把Add操作放在With块里,不用单独拆成一行:
Dim myList As New List(Of Object) Dim label1 As New Label With label1 .Top = 50 .Left = 100 .Text = "Something" .Font = New Font("Arial", 12, FontStyle.Bold) ' 这里还是得显式写label1,但至少不用单独开一行 myList.Add(label1) Panel1.Controls.Add(label1) End With
为什么没有隐式引用?
VB.NET的With语句设计初衷只是简化对对象属性和方法的调用,并没有提供一个类似C#this的隐式变量来指代目标对象,所以必须显式引用原来的变量名才能把它加入集合。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

