【问题标题】:Can With/End With (VB.NET) be used when IDisposable is not available?当 IDisposable 不可用时,可以使用 With/End With (VB.NET) 吗?
【发布时间】:2011-02-06 22:00:09
【问题描述】:

如果由于IDisposable 未实现而无法使用Using,下面的代码对于With/End With 是否可行?这会导致内存泄漏还是最好设置一个实例变量然后将其设置为空?

With New System.IO.FileInfo(sFileName)
   ' Do some work
End With

【问题讨论】:

    标签: vb.net using-statement with-statement


    【解决方案1】:

    With 关键字与 IDisposable 或 Using 关键字没有任何关系。这只是一个方便的捷径,可以避免输入对象引用的名称。

        With New System.IO.FileInfo(sfilename)
            Console.WriteLine(.Length)    '' note the dot without an object reference
            '' etc..
        End With
    

    等同于:

        Dim info = New System.IO.FileInfo(sfilename)
        Console.WriteLine(info.Length)
        '' etc..
    

    由于 FileInfo 没有实现 IDisposable,否则您对 Using 没有任何用处。 不要避免假设 With 负责处理在 With 语句中使用的对象引用。它没有。确实有点道理,但是它存在 15 年以上会阻止 VB.NET 团队如此显着地改变其行为。输入更少的代码只是一个捷径。在过去的“为什么 C# 没有 with 关键字”问题中非常重要。 C# 早期的烫手山芋,但现在已经没有一段时间了。

    【讨论】:

    • 在您的 With/End With 示例代码中,With 语句正在实例化一个新的 System.IO.FileInfo 对象,当达到 End With 时,没有对象变量可以设置为空。垃圾收集器是否看到未引用的对象并清理它?在“same as”示例中,我们可以设置 info = Nothing,但使用 With/End With 语法我们没有对象变量可以设置为空。
    • 将局部变量设置为 Nothing 没有意义,垃圾收集器已经知道对象引用何时不再重要。它从 JIT 编译器获取该信息。 “info = Nothing”的代码实际上会被 JIT 优化器删除。 GC.KeepAlive() 在这里是相关的。
    【解决方案2】:

    With 与内存或资源使用无关。这只是一个简写符号。

    【讨论】:

      【解决方案3】:
      With
      

      不仅仅是简写符号。如果根据 MSDN 在对象上设置大量属性可以稍微提高性能,“如果对象的限定路径很长,使用 With...End With 可以提高性能。” (请参阅http://msdn.microsoft.com/en-us/library/wc500chb.aspx 上的备注)这样做的原因是 with 块只需获取一次对象引用,然后它会为每个后续调用重用该对象引用。如果每次运行时都必须多次获取对象引用时显式列出对象。差别不大,但在某些情况下可能很重要。

      【讨论】:

      • "With" 是一种简写符号,但它的简写符号 for 的具体含义会因参数的性质而异。如果参数是从数组引用的值类型,并且 With 中的闭包使用该引用,“With Foo(index) ... .X=5”大致相当于“$TEMP1=Foo : $TEMP2 =index : ... $TEMP1($TEMP2)=5".
      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多