Как оператор "Использовать" переводится с С# на 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 опубликовал эквивалентное обходное решение.
Ответы
Ответ 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
переопределяет переменную класса члена, а на С# это не так!
Конечно, возможно, я что-то пропустил.