作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是想我会分享这个以防其他人遇到这个问题。
我今天做了类似的事情,我花了一段时间才弄清楚为什么这会导致运行时出现问题。
这段代码:
Public Class foo
Public bar As String = "blah"
End Class
Public Sub DoInline()
Dim o As New foo
Dim f As Func(Of String)
With o
f = Function() .bar
End With
Try
Console.WriteLine(f.DynamicInvoke())
Catch ex As Reflection.TargetInvocationException
Console.WriteLine(ex.InnerException.ToString)
End Try
End Sub
Public Shared Sub DoInline()
Dim o As New foo
Dim $VB$Closure_ClosureVariable_7A_6 As New _Closure$__1
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = o
Dim f As Func(Of String) = New Func(Of String)(AddressOf $VB$Closure_ClosureVariable_7A_6._Lambda$__1)
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
Try
Console.WriteLine(RuntimeHelpers.GetObjectValue(f.DynamicInvoke(New Object(0 - 1) {})))
Catch exception1 As TargetInvocationException
ProjectData.SetProjectError(exception1)
Console.WriteLine(exception1.InnerException.ToString)
ProjectData.ClearProjectError
End Try
End Sub
$VB$Closure_ClosureVariable_7A_6.$VB$Local_VB$t_ref$L0 = Nothing
最佳答案
这种行为是“设计使然”,是由 With
的一个经常被误解的细节造成的。陈述。With
语句实际上将表达式作为参数而不是直接引用(即使它是最常见的用例之一)。语言规范的第 10.3 节保证表达式传递到 With
块仅被评估一次并且可用于执行 With
陈述。
这是通过使用临时文件来实现的。所以在执行 .Member
时表达在 With
中声明您访问的不是原始值,而是指向原始值的临时值。它允许其他有趣的场景,例如以下内容。
Dim o as New Foo
o.bar = "some value"
With o
o = Nothing
Console.WriteLine(.bar) ' Prints "some value"
End With
With
里面您不在操作的声明
o
而是临时指向原始表达式。这个临时文件只能保证在
With
的生命周期内有效声明,因此是
Nothing
d 最后出来。
With
之后执行时语句完成临时是
Nothing
并且代码适本地失败了。
关于VB.Net - "With"和闭包不混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4054837/
我是一名优秀的程序员,十分优秀!