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