【问题标题】:How does the "Using" statement translate from C# to VB?“Using”语句如何从 C# 转换为 VB?
【发布时间】:2009-05-20 13:17:29
【问题描述】:

例如:

BitmapImage bitmap = new BitmapImage();

byte[] buffer = GetHugeByteArray(); // from some external source
using (MemoryStream stream = new MemoryStream(buffer, false))
{
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze();
}

你能告诉我更多关于using的信息吗?

编辑:

正如 JaredPar 帖子的 cmets 中所讨论的,这个问题更关注 VS2003 中 Using 的实现。有人指出 Using 直到 .NET 2.0 (VS2005) 才引入。 JaredPar 发布了一个等效的解决方法。

【问题讨论】:

  • 搜索“使用关键字 C#”或一些变体。
  • 来自 Visual Basic 编程指南: How to: Dispose of a System Resource (Visual Basic)
  • 对于那些寻找相当于 using 指令的人来说。使用 System.Net;答案在这里stackoverflow.com/questions/4134472/…
  • 在 VB.net 中使用也可以在 C# 需要两个单独的行的情况下执行复合条目。此外,可以使用隐含类型,即: Using x = New MemoryStream(buffer1), y = New MemoryStream(buffer2) ..... End Using

标签: c# .net vb.net visual-studio-2005 .net-2.0


【解决方案1】:

假设您使用的是 .NET 2.0 或更高版本(这意味着 VB.NET v8 编译器或更高版本),在 VB 中 Using 的语法与 C# 几乎相同。基本上,只需删除大括号并添加“结束使用”

Dim bitmap as New BitmapImage()
Dim buffer As Byte() = GetHugeByteArrayFromExternalSource()
Using stream As New MemoryStream(buffer, false)
    bitmap.BeginInit()
    bitmap.CacheOption = BitmapCacheOption.OnLoad
    bitmap.StreamSource = stream
    bitmap.EndInit()
    bitmap.Freeze()
End Using

您可以在此处获取完整文档

编辑

如果您使用的是 VS2003 或更早版本,您将需要以下代码。 using 语句直到 VS 2005 .NET 2.0 (reference) 才引入。谢谢克里斯!以下等价于 using 语句。

Dim bitmap as New BitmapImage()
Dim buffer As Byte() = GetHugeByteArrayFromExternalSource()
Dim stream As New MemoryStream(buffer, false)
Try
    bitmap.BeginInit()
    bitmap.CacheOption = BitmapCacheOption.OnLoad
    bitmap.StreamSource = stream
    bitmap.EndInit()
    bitmap.Freeze()
Finally
    DirectCast(stream, IDisposable).Dispose()
End Try

【讨论】:

  • 这是添加了哪个版本的VB?我正在处理一些遗留代码,而 Visual Studio 2003 似乎没有接受它。
  • @hypoxide,使用语句自最初的 VB.Net AFAIK 以来一直存在。我更改了代码以删除一些直到更高版本才可用的项目。您可以尝试一下,如果您发现任何错误,请在此处添加?
  • VB 中的 Using 语句直到 VS2005 才引入。它在以前的版本中不可用。
  • 克里斯是正确的:en.wikipedia.org/wiki/…
  • 另请注意,对于命名空间引用和别名声明,C# using 与 VB 的 Imports 相同。
【解决方案2】:

需要指出的是,using其实是编译成多行代码,类似于lock等

来自 C# 语言规范.... 形式的 using 语句

using (ResourceType resource = expression) statement

对应于两种可能的扩展之一。当ResourceType为值类型时,展开为

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        ((IDisposable)resource).Dispose();
    }
}

否则,当ResourceType为引用类型时,展开为

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        if (resource != null) ((IDisposable)resource).Dispose();
    }
}

(结束语言规范 sn-p)

基本上,在编译时将其转换为该代码。没有称为 using 等的方法。我试图在 vb.net 语言规范中找到类似的东西,但我找不到任何东西,大概它做了完全相同的事情。

【讨论】:

    【解决方案3】:

    应该是这样的:

    Dim bitmap As New BitmapImage()
    Dim buffer As Byte() = GetHugeByteArray()
    Using stream As New MemoryStream(buffer, False)
        bitmap.BeginInit()
        bitmap.CacheOption = BitmapCacheOption.OnLoad
        bitmap.StreamSource = stream
        bitmap.EndInit()
        bitmap.Freeze()
    End Using
    

    【讨论】:

      【解决方案4】:

      关键是被“使用”的类必须实现IDisposable接口。

      【讨论】:

        【解决方案5】:

        似乎using(C#) 和Using(VB) 有一个极其重要的区别。而且至少现在对我来说,它可以打败Using的目的。

        Imports System.IO
        Class Program
        
            Private Shared sw As StreamWriter
        
            Private Shared Sub DoSmth()
                sw.WriteLine("foo")
            End Sub
        
            Shared Sub Main(ByVal args As String())
                Using sw = New StreamWriter("C:\Temp\data.txt")
                    DoSmth()
                End Using
            End Sub
        End Class
        

        你会得到 NullReferenceException,因为在 VB 中 Using 重新定义了成员类变量,而在 C# 中却没有!

        当然,也许我错过了什么..

        【讨论】:

        • 它不会重新定义成员变量,它会在方法的范围内覆盖它。它仍然存在,并且具有相同的名称
        猜你喜欢
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2019-09-25
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多