it-swarm.com.de

Wie wird die Anweisung "using" von C # in VB übersetzt?

Zum Beispiel:

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();
}

Kannst du mir mehr über using erzählen?

Bearbeiten:

Wie in den Kommentaren des Beitrags von JaredPar erörtert, befasst sich diese Frage eher mit einer Implementierung von Using in VS2003. Es wurde darauf hingewiesen, dass Using erst mit .NET 2.0 (VS2005) eingeführt wurde. JaredPar hat eine gleichwertige Problemumgehung veröffentlicht.

42
Daniel

Using hat praktisch die gleiche Syntax in VB wie C #, vorausgesetzt, Sie verwenden .NET 2.0 oder höher (was den VB.NET v8-Compiler oder höher impliziert). Entfernen Sie einfach die Klammern und fügen Sie ein "Ende mit" hinzu.

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

Die vollständige Dokumentation erhalten Sie hier

EDIT

Wenn Sie VS2003 oder eine frühere Version verwenden, benötigen Sie den folgenden Code. Die using-Anweisung wurde erst mit VS 2005, .NET 2.0 ( reference ) eingeführt. Danke Chris !. Folgendes entspricht der using-Anweisung.

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
61
JaredPar

Es ist wichtig darauf hinzuweisen, dass using tatsächlich in verschiedene Codezeilen kompiliert wird, ähnlich wie beim Sperren usw.

Aus der C # -Sprachenspezifikation .... Eine using-Anweisung des Formulars

using (ResourceType resource = expression) statement

entspricht einer von zwei möglichen Erweiterungen. Wenn ResourceType ein Werttyp ist, ist die Erweiterung

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

Andernfalls ist die Erweiterung, wenn es sich bei ResourceType um einen Referenztyp handelt

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

(Ende-Sprachspezifikation)

Zum Zeitpunkt der Kompilierung wird der Code grundsätzlich in diesen Code umgewandelt. Es gibt keine Methode, die mit using usw. aufgerufen wird. Ich habe versucht, ähnliche Informationen in der vb.net-Sprachspezifikation zu finden, konnte aber nichts finden. Vermutlich tut es genau dasselbe.

5
Allen Rice

Das wäre ungefähr so:

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
3
Bojan Resnik

Der Schlüsselpunkt ist, dass die "verwendete" Klasse die IDisposable-Schnittstelle implementieren muss.

3
LunaCrescens

Scheinbar wie using (C #) und Using (VB) haben einen extrem wichtigen Unterschied. Und zumindest für mich kann es den Zweck von Using besiegen.

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

Sie erhalten NullReferenceException, da in VB Using die Member-Klassenvariable neu definiert wird, während dies in C # nicht der Fall ist!

Natürlich fehlt mir vielleicht etwas ..

1
Alex