Подтвердить что ты не робот

Как оператор "Использовать" переводится с С# на 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?

Edit:

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

4b9b3361

Ответ 1

Использование имеет практически тот же синтаксис в VB как С#, если вы используете .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

Здесь вы можете получить полную документацию

ИЗМЕНИТЬ

Если вы используете VS2003 или ранее, вам понадобится код ниже. Оператор using не был введен до 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

Ответ 2

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

Из спецификации языка С#.... Использующая формулировка формы

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

Это будет примерно так:

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

Ответ 4

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

Ответ 5

Кажется, что using (С#) и 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 переопределяет переменную класса члена, а на С# это не так!

Конечно, возможно, я что-то пропустил.