“使用”语句如何从C#转换为VB?

时间:2009-05-20 13:17:29

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

例如:

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的帖子中所讨论的那样,这个问题更关注VS2003中Using的实现。有人指出,直到.NET 2.0(VS2005)才引入Using。 JaredPar发布了一个等效的解决方法。

5 个答案:

答案 0 :(得分:62)

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

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或更早版本,则需要以下代码。直到VS 2005,.NET 2.0(reference)才引入using语句。谢谢克里斯!以下等同于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

答案 1 :(得分:5)

重要的是要指出,使用实际上编译成各种代码行,类似于锁等。

来自C#语言规范.... 表格的使用声明

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();
    }
}

(结束语言规范摘要)

基本上,在编译时它转换为该代码。没有方法叫做使用等。我试图在vb.net语言规范中找到类似的东西,但是我找不到任何东西,大概它完全一样。

答案 2 :(得分: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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

似乎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#中却没有!

当然,也许我错过了一些东西......