Хотя преобразование из С# не работает в VB.NET

Тут я, наверное, туплю. Я делаю преобразование из 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Другие вопросы по теме

Похожие вопросы

В моей dll класса С# я хочу вызвать метод с фиксированным именем «func_X», который должен быть помещен в приложение С#, где вызывается dll. Как мне это сделать?
Получение NullReferenceException и ссылки на объект, не установленной на экземпляр объекта при попытке получить утверждение роли из заголовка
Не отвечает - приложение С# аварийно завершает работу без каких-либо сообщений об ошибках
AddJsonOptions не работает в Blazor Server
Как создать Http Trigger и Time Trigger в одной лазурной функции на С#?
С# многопоточный или многопроцессорный?
Используя ASP.NET Core MVC с .NET 6, число из входного тега в форме теряет десятичный разделитель при передаче в контроллер
Нужно ли вызывать DisposeAsync для FileStream при использовании его с использованием предложения?
Проблема с предоставлением информации о балансировке нагрузки с помощью AxMSTSCLib
Преобразование асинхронной лямбды только с вызовом OperationCanceledException в синхронный вариант