Comment la déclaration «Using» se traduit-elle de C # à 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 l’ using ?

Modifier:

Comme cela a été discuté dans les commentaires du post de JaredPar, cette question concerne davantage une implémentation de l’ Using de VS2003. Il a été souligné qu’Utiliser n’a pas été introduit jusqu’à .NET 2.0 (VS2005). JaredPar a publié une solution de contournement équivalente.

Utiliser pratiquement la même syntaxe dans VB que C #, en supposant que vous utilisez .NET 2.0 ou version ultérieure (ce qui implique le compilateur VB.NET v8 ou version ultérieure). Fondamentalement, il suffit de supprimer les accolades et d’append un “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 

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 pas été introduite avant VS 2005, .NET 2.0 ( référence ). 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 

Il est important de souligner que l’utilisation est en fait compilée en différentes lignes de code, similaires au locking, etc.

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

 using (ResourceType resource = expression) statement 

correspond à l’une des deux extensions possibles. Lorsque ResourceType est un type de valeur, l’extension 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 dans ce code. Il n’y a pas de méthode appelée utilisation, etc. J’ai essayé de trouver des éléments similaires dans la spécification du langage vb.net, mais je n’ai rien trouvé, probablement la même chose.

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 

Le point clé est que la classe “utilisée” doit implémenter l’interface IDisposable.

Semble using (C #) et Using (VB) ont une différence extrêmement importante. Et au moins pour moi maintenant, cela peut vaincre l’objective d’ 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 Ssortingng()) Using sw = New StreamWriter("C:\Temp\data.txt") DoSmth() End Using End Sub End Class 

Vous obtiendrez NullReferenceException, car dans VB Using redéfinit la variable de classe de membre alors que dans C # ce n’est pas le cas!

Bien sûr, il me manque peut-être quelque chose ..