2009-05-20 3 views
37

"Using"ステートメントは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は同等の回避策を発表しました。

+2

"キーワードC#を使用して"またはのバリエーションを検索してください。 –

+1

** Visual Basicプログラミングガイド:** [方法:システムリソースの廃棄(Visual Basic)](http://msdn.microsoft.com/en-us/library/wydd5hkd.aspx) – DavidRR

+0

usingディレクティブと同等のものを探します。 using System.Net;答えはここにありますhttp://stackoverflow.com/questions/4134472/vb-net-equivalent-to-cs-using-directive –

答えて

54

.NET 2.0以降(VB.NET v8コンパイラ以降を意味します)を使用していると仮定すると、VBではC#と同じ構文を使用しています。基本的には、単に「括弧を削除した場合はあなたがここに

を完全なドキュメントを取得することができます

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)まで導入されていませんでした。 Chrisに感謝します。以下は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 
+0

これはどのVBのバージョンが追加されたのですか?私はいくつかのレガシーコードで作業しています.Visual Studio 2003はそれを理解していないようです。 – Daniel

+0

@hypoxide、usingステートメントは、元のVB.Net AFAIK以来存在しています。私は、後のバージョンまで利用できなかったいくつかの項目を取り除くためにコードを変更しました。それを試すことができますか?エラーが表示されたら、ここに追加してください。 – JaredPar

+0

私は試しましたが、ダイスはありませんでした。 – Daniel

2

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 
2

キーポイントは「使用」クラスビーイングは、IDisposableインターフェイスを実装しなければならないということです。

4

C#言語仕様から使用が実際など、ロックと同様に、コードの種々のラインにコンパイルされていることを

を指摘するために、その重要.... 形態

using (ResourceType resource = expression) statement 
の使用ステートメント

は、2つの可能な拡張のうちの1つに対応します。 ResourceTypeが値型である場合ResourceTypeが基準型である場合、膨張は

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

そうでない場合、拡張は、コンパイル時に、基本的に

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

(エンド言語仕様スニペット)

でありますそのコードに変換されます。私はvb.net言語仕様で同様のものを見つけようとしましたが、何も見つかりませんでした。おそらくそれはまったく同じことです。

0

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のようにとNullReferenceExceptionを取得しますC#で、それはそうではないメンバーのクラス変数を再定義!

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

+1

メンバー変数を再定義しません。メソッドのスコープ内でメンバー変数をオーバーライドします。それはまだ存在し、同じ名前を持っています – jmoreno

関連する問題