简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM