web-dev-qa-db-ja.com

「使用」ステートメントはどのようにC#からVBに変換されますか?

例えば:

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は同等の回避策を投稿しました。

44
Daniel

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

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言語仕様で類似のものを見つけようとしましたが、何も見つかりませんでした。おそらくまったく同じことをしているでしょう。

5
Allen Rice

これは次のようになります。

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

重要な点は、「使用される」クラスがIDisposableインターフェイスを実装する必要があることです。

3
LunaCrescens

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#では定義しません。

もちろん、何かが足りないかもしれません。

1
Alex