Тут я, наверное, туплю. Я делаю преобразование из C# в VB.NET для небольшого фрагмента кода, который загружает видео, но, хотя это прекрасно работает в C#, в VB.NET это не так. Код такой:
using (var input = await client.GetStreamAsync(video.Uri))
{
byte[] buffer = new byte[16 * 1024];
int read;
int totalRead = 0;
Console.WriteLine("Download Started");
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
totalRead += read;
Console.Write($"\rDownloading {totalRead}/{totalByte} ...");
}
Console.WriteLine("Download Complete");
}
В C# это нормально загружает видео, но в VB.NET синтаксис строки while не преобразуется должным образом, и поэтому ничего не загружается. Может ли кто-нибудь помочь с синтаксисом VB.NET для строки «пока», пожалуйста? В противном случае кажется, что «чтение» никогда не становится больше нуля.
В настоящее время код VB.NET выглядит следующим образом:
Using input = Await client.GetStreamAsync(video.Uri)
Dim buffer = New Byte(16 * 1024) {} '(81919) {} ' (16 * 1024) {}
Dim read As Integer
Dim totalRead = 0
Console.Write("Download Started")
While read = (input.Read(buffer, 0, buffer.Length) > 0)
output.Write(buffer, 0, read)
totalRead += read
Console.Write($"Downloading {totalRead}/{totalByte} ...")
End While
Console.Write("Download Complete")
End Using
VB использует один и тот же оператор как для присваивания, так и для проверки на равенство, поэтому любая попытка присваивания в выражении будет интерпретироваться как проверка на равенство. Решение состоит в том, чтобы извлечь присваивание и воспроизвести его непосредственно перед циклом и в конце цикла:
read = input.Read(buffer, 0, buffer.Length)
Do While read > 0
output.Write(buffer, 0, read)
totalRead += read
Console.Write($"Downloading {totalRead}/{totalByte} ...")
read = input.Read(buffer, 0, buffer.Length)
Loop
VB можно улучшить, добавив в него отдельный оператор, позволяющий присваивать значения внутри выражений (см. оператор Python 'walrus'), но в языке больше нет запланированных изменений.
честно говоря, мне никогда не нравилось, что c# допускает присваивание в качестве выражения.
Тем не менее, я также не люблю повторять это заявление чтения!!!
Итак, стоимость блока if мы получаем:
Using input As Stream = Await client.GetStreamAsync(video.Url)
Dim buffer(16 * 1024) As Byte
Dim read As Integer
Dim totalRead As Integer = 0
Console.WriteLine("Download Started")
Do
read = input.Read(buffer, 0, buffer.Length)
If read > 0 Then
output.Write(buffer, 0, read)
totalRead += read
Console.Write($"{vbCrLf}Dwnloading {totalRead}/{totalByte} ....")
End If
Loop While read > 0
Console.WriteLine("Download Complete")
End Using