例えば:
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();
}
using
についてもう少し教えてもらえますか?
編集:
JaredParの投稿のコメントで説明したように、この質問はVS2003でのUsing
の実装に関係しています。 Using
は.NET 2.0(VS2005)まで導入されなかったことが指摘されました。 JaredParは同等の回避策を投稿しました。
Usingは、.NET 2.0以降(VB.NET v8コンパイラ以降を意味します)を使用していると仮定すると、VBでほぼ同じ構文を持ちます。基本的に、中かっこを削除し、 「使用終了」を追加します
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
完全なドキュメントはこちらから入手できます
[〜#〜] edit [〜#〜]
VS2003以前を使用している場合は、以下のコードが必要です。 usingステートメントは、VS 2005、.NET 2.0( reference )まで導入されませんでした。クリスありがとう!次は、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
Usingは実際にはロックなどのさまざまなコード行にコンパイルされることを指摘することが重要です。
C#言語仕様から。..形式のusingステートメント
using (ResourceType resource = expression) statement
2つの可能な展開の1つに対応します。 ResourceType
が値型の場合、展開は
{
ResourceType resource = expression;
try {
statement;
}
finally {
((IDisposable)resource).Dispose();
}
}
それ以外の場合、ResourceTypeが参照タイプの場合、展開は
{
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
}
(終了言語仕様スニペット)
基本的に、コンパイル時にそのコードに変換されます。 usingなどのメソッドはありません。vb.net言語仕様で類似のものを見つけようとしましたが、何も見つかりませんでした。おそらくまったく同じことをしているでしょう。
これは次のようになります。
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
重要な点は、「使用される」クラスがIDisposableインターフェイスを実装する必要があることです。
using
(C#)とUsing
(VB)には、非常に重要な違いがあるようです。そして少なくとも私にとっては、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
VB Using
はメンバークラス変数を再定義しますが、C#では定義しません。
もちろん、何かが足りないかもしれません。