2009-05-20 17 views
37

Por ejemplo:¿Cómo se traduce la instrucción "Using" de C# a 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(); 
} 

¿Me puede decir nada más sobre using?

Editar:

Como se discutió en los comentarios del post de JaredPar, esta pregunta se refiere más a una implementación de Using en VS2003. Se señaló que Using no se introdujo hasta .NET 2.0 (VS2005). JaredPar publicó una solución equivalente.

+2

Buscar "usar la palabra clave C#" o alguna variación de. –

+1

De la ** Guía de programación de Visual Basic: ** [Cómo: deshacerse de un recurso del sistema (Visual Basic)] (http://msdn.microsoft.com/en-us/library/wydd5hkd.aspx) – DavidRR

+0

Para aquellos buscando el equivalente de la directiva de uso, es decir. usando System.Net; la respuesta está aquí http://stackoverflow.com/questions/4134472/vb-net-equivalent-to-cs-using-directive –

Respuesta

54

El uso tiene prácticamente la misma sintaxis en VB que C#, suponiendo que esté usando .NET 2.0 o posterior (lo que implica el compilador VB.NET v8 o posterior). Básicamente, basta con retirar las llaves y añadir un "Fin El uso de"

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 

Usted puede obtener la documentación completa aquí

EDITAR

Si' Si usa VS2003 o una versión anterior, necesitará el siguiente código. La instrucción using no se introdujo hasta VS 2005, .NET 2.0 (reference). Gracias Chris !. Lo siguiente es equivalente a la declaración de uso.

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

¿Qué versión de VB se agregó? Estoy trabajando con un código heredado y Visual Studio 2003 no parece estar retomándolo. – Daniel

+0

@hypoxide, la sentencia using ha existido desde el VB.Net AFAIK original. Cambié el código para deshacerme de un par de elementos que no estaban disponibles hasta versiones posteriores. ¿Puedes intentarlo y si ves algún error, agrégalo aquí? – JaredPar

+0

Lo intenté, pero no hay dados. – Daniel

2

Eso sería algo como esto:

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

El punto clave es que el ser de clase "utilizado" debe implementar la interfaz IDisposable.

4

Es importante señalar que el uso es en realidad compilado en varias líneas de código, similar a bloquear, etc.

De la especificación del lenguaje C# .... A usando enunciado de la forma

using (ResourceType resource = expression) statement 

corresponde a una de las dos expansiones posibles. Cuando ResourceType es un tipo de valor, la expansión es

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

lo contrario, cuando TipoRecurso es un tipo de referencia, la expansión es

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

(extremo fragmento especificación del lenguaje)

Básicamente, durante la compilación el tiempo se convierte en ese código. No hay un método llamado usar, etc. Traté de encontrar cosas similares en la especificación del lenguaje vb.net pero no pude encontrar nada, presumiblemente hace exactamente lo mismo.

0

Parece que using (C#) y Using (VB) tienen una diferencia extremadamente importante. Y al menos para mí ahora, puede vencer el propósito 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 

Usted obtendrá NullReferenceException como en VB Using redefine la variable miembro de la clase, mientras que en C# no es así!

Por supuesto, tal vez me falta algo ...

+1

no redefine la variable miembro, la reemplaza dentro del alcance del método. Todavía existe, y tiene el mismo nombre – jmoreno

Cuestiones relacionadas