Как оператор «Using» переводит из C # в VB? - PullRequest
44 голосов
/ 20 мая 2009

Например:

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?

Edit:

Как обсуждалось в комментариях к посту JaredPar, этот вопрос больше касается реализации Using в VS2003. Было отмечено, что Using не был введен до .NET 2.0 (VS2005). JaredPar опубликовал эквивалентный обходной путь.

Ответы [ 5 ]

62 голосов
/ 20 мая 2009

Использование имеет практически тот же синтаксис в VB, что и C #, при условии, что вы используете .NET 2.0 или более позднюю версию (что подразумевает компилятор VB.NET v8 или более позднюю версию). В основном, просто удалите фигурные скобки и добавьте «End Using»

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 или более раннюю версию, вам понадобится приведенный ниже код. Оператор использования не был введен до VS 2005, .NET 2.0 ( ссылка ). Спасибо Крис! Следующее эквивалентно оператору 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
5 голосов
/ 20 мая 2009

Важно отметить, что использование на самом деле скомпилировано в различные строки кода, похожие на блокировку и т. Д.

Из спецификации языка C # .... Заявление об использовании формы

using (ResourceType resource = expression) statement

соответствует одному из двух возможных расширений. Когда ResourceType является типом значения, расширение равно

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

В противном случае, когда ResourceType является ссылочным типом, расширение составляет

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

(фрагмент спецификации конечного языка)

По сути, во время компиляции он конвертируется в этот код. Не существует метода, называемого использованием и т. Д. Я пытался найти подобные вещи в спецификации языка vb.net, но ничего не смог найти, предположительно, он делает то же самое.

3 голосов
/ 20 мая 2009

Ключевым моментом является то, что используемый класс должен реализовывать интерфейс IDisposable.

3 голосов
/ 20 мая 2009

Это было бы что-то вроде этого:

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
1 голос
/ 14 октября 2013

Кажется, что 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

Вы получите NullReferenceException, как в VB Using, переопределяет переменную класса-члена, а в C # - нет!

Конечно, может быть, я что-то упустил ..

...