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

例如:

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

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

 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( 参考 )才被引入。 谢谢Chris! 以下相当于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 

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

从C#语言规范…一个使用语句的forms

 using (ResourceType resource = expression) statement 

对应于两种可能的扩展之一。 当ResourceType是一个值types时,扩展是

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

否则,当ResourceType是引用types时,扩展是

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

(结束语言规范片段)

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

这将是这样的:

 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 

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

似乎using (C#)和Using (VB)有一个非常重要的区别。 至less对我来说,这可以击败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重新定义成员类variables,而在C#中它不!

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