How does the “Using” statement translate from C# to VB?

前端 未结 5 939
星月不相逢
星月不相逢 2020-12-03 09:20

For example:

BitmapImage bitmap = new BitmapImage();

byte[] buffer = GetHugeByteArray(); // from some external source
using (MemoryStream stream = new Memor         


        
相关标签:
5条回答
  • 2020-12-03 10:04

    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
    
    0 讨论(0)
  • 2020-12-03 10:05

    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

    using (ResourceType resource = expression) statement
    

    corresponds to one of two possible expansions. When ResourceType is a value type, the expansion is

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

    Otherwise, when ResourceType is a reference type, the expansion is

    {
        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.

    0 讨论(0)
  • 2020-12-03 10:15

    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). 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

    • http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

    EDIT

    If you're using VS2003 or earlier you'll need the below code. The using statement was not introduced until VS 2005, .NET 2.0 (reference). Thanks Chris!. The following is equivalent to the using statement.

    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
    
    0 讨论(0)
  • 2020-12-03 10:18

    The key point is that the class being "used" must implement the IDisposable interface.

    0 讨论(0)
  • 2020-12-03 10:18

    Seems like using(C#) and Using (VB) have an extremely important difference. And at least for me now, it can defeat the purpose of 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!

    Of course, maybe I missing something..

    0 讨论(0)
提交回复
热议问题