“使用”语句如何从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#中它不!
当然,也许我错过了一些东西