[英]How does the “Using” statement translate from C# to VB?
For example: 例如:
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();
}
Can you tell me any more about using
? 你能告诉我关于using
更多信息吗?
Edit: 编辑:
As was discussed in the comments of JaredPar's post, this question is more concerned with an implementation of Using
in VS2003. 正如JaredPar帖子的评论中所讨论的,这个问题更关注在VS2003中Using
的实现。 It was pointed out that Using
was not introduced until .NET 2.0 (VS2005). 有人指出,直到.NET 2.0(VS2005)才引入Using
。 JaredPar posted an equivalent workaround. JaredPar发布了一个相同的解决方法。
Using has virtually the same syntax in VB as C#, assuming you're using .NET 2.0 or later (which implies the VB.NET v8 compiler or later). 假设您使用的是.NET 2.0或更高版本(暗示VB.NET v8编译器或更高版本),则在VB中使用与C#几乎相同的语法。 Basically, just remove the braces and add a "End Using" 基本上,只需删除大括号并添加“结束使用”
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
You can get the full documentation here 您可以在此处获取完整的文档
EDIT 编辑
If you're using VS2003 or earlier you'll need the below code. 如果您使用的是VS2003或更早版本,则需要以下代码。 The using statement was not introduced until VS 2005, .NET 2.0 ( reference ). 直到VS 2005,.NET 2.0( 参考 )才引入using语句。 Thanks Chris!. 谢谢克里斯! The following is equivalent to the using statement. 以下等同于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
Its important to point out that using is actually compiled into various lines of code, similar to lock, etc. 重要的是要指出,使用实际上编译成各种代码行,类似于锁等。
From the C# language specification.... A using statement of the form 来自C#语言规范....表单的using语句
using (ResourceType resource = expression) statement
corresponds to one of two possible expansions. 对应于两种可能的扩展之一。 When ResourceType
is a value type, the expansion is 当ResourceType
是值类型时,扩展为
{
ResourceType resource = expression;
try {
statement;
}
finally {
((IDisposable)resource).Dispose();
}
}
Otherwise, when ResourceType is a reference type, the expansion is 否则,当ResourceType是引用类型时,扩展为
{
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
}
(end language specification snippet) (结束语言规范片段)
Basically, at compile time its converted into that code. 基本上,在编译时它将转换为该代码。 There is no method called using, etc. I tried to find similar stuff in the vb.net language specification but I couldn't find anything, presumably it does the exact same thing. 没有方法叫做使用等。我试图在vb.net语言规范中找到类似的东西,但我找不到任何东西,大概它完全一样。
That would be something like this: 那将是这样的:
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接口。
Seems like using
(C#) and Using
(VB) have an extremely important difference. 似乎using
(C#)和Using
(VB)有一个非常重要的区别。 And at least for me now, it can defeat the purpose of Using
. 至少对我来说,它可以打败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
You'll get NullReferenceException as in VB Using
redefines the member class variable while in C# it doesn't! 您将获得NullReferenceException,如在VB中Using
重新定义成员类变量,而在C#中它没有!
Of course, maybe I missing something.. 当然,也许我错过了一些东西..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.