web-dev-qa-db-fra.com

Comment l'instruction "Using" traduit-elle de C # en VB?

Par exemple:

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

Pouvez-vous m'en dire plus sur using?

Modifier:

Comme discuté dans les commentaires de l'article de JaredPar, cette question concerne davantage une implémentation de Using dans VS2003. Il a été souligné que Using n’était pas introduit avant .NET 2.0 (VS2005). JaredPar a posté une solution de contournement équivalente.

42
Daniel

Using VB que C # a pratiquement la même syntaxe, si vous utilisez .NET 2.0 ou une version ultérieure (ce qui implique le compilateur VB.NET v8 ou une version ultérieure). Fondamentalement, il suffit de supprimer les accolades et d'ajouter un "Fin d'utilisation"

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

Vous pouvez obtenir la documentation complète ici

MODIFIER

Si vous utilisez VS2003 ou une version antérieure, vous aurez besoin du code ci-dessous. L'instruction using n'a été introduite que par VS 2005, .NET 2.0 ( reference ). Merci Chris !. Ce qui suit est équivalent à l'instruction 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
61
JaredPar

Il est important de noter que l'utilisation est en fait compilée dans différentes lignes de code, similaire à lock, etc.

A partir de la spécification du langage C # .... Une instruction using de la forme

using (ResourceType resource = expression) statement

correspond à l'une des deux extensions possibles. Lorsque ResourceType est un type de valeur, le développement est

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

Sinon, lorsque ResourceType est un type de référence, l’extension est

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

(extrait de spécification de langue de fin)

Fondamentalement, au moment de la compilation, il est converti en ce code. Il n’existe pas de méthode appelée using, etc. J’ai essayé de trouver des informations similaires dans la spécification de langage vb.net mais je n’ai rien trouvé; je suppose qu’il fait exactement la même chose.

5
Allen Rice

Ce serait quelque chose comme ça:

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

Le point clé est que la classe "utilisée" doit implémenter l'interface IDisposable.

3
LunaCrescens

On dirait que using (C #) et Using (VB) ont une différence extrêmement importante. Et au moins pour moi maintenant, cela peut aller à l'encontre du but de 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

Vous obtiendrez NullReferenceException comme dans VB Using redéfinit la variable de classe membre alors qu'en C # ce n'est pas le cas!

Bien sûr, peut-être que je manque quelque chose ..

1
Alex