Примечание. Этот ответ устарел. С тех пор блоки итераторов добавлены в VB.NET
C # переводит ключевое слово yield в конечный автомат во время компиляции. VB.NET не имеет ключевого слова yield, но у него есть собственный механизм для безопасного встраивания состояния в функцию, которая нелегко доступна в C #.
Ключевое слово C # static
обычно переводится в Visual Basic с использованием ключевого слова Shared
, но есть два момента, где все становится запутанным. Во-первых, статический класс C # на самом деле является модулем в Visual Basic, а не классом Shared (можно подумать, что они позволят вам кодировать его в любом случае в Visual Basic, но это не так). Другое дело, что у VB.NET есть собственное ключевое слово Static
. Однако Static
имеет другое значение в VB.NET.
Вы используете ключевое слово Static
в VB.NET для объявления переменной внутри функции, и при этом переменная сохраняет свое состояние при вызове функции. Это отличается от простого объявления частного статического члена класса в C #, поскольку член статической функции в VB.NET гарантированно также является поточно-ориентированным, поскольку компилятор преобразует его для использования класса Monitor во время компиляции.
Так зачем писать все это здесь? Что ж, должна быть возможность создать универсальный класс Iterator<T>
многократного использования (или Iterator(Of T)
в VB.NET). В этом классе вы реализуете конечный автомат, используемый C #, с методами Yield()
и Break()
, которые соответствуют ключевым словам C #. Затем вы могли бы использовать статический экземпляр (в смысле VB.NET) в функции, чтобы в конечном итоге он мог выполнять почти ту же работу, что и yield
в C #, примерно в том же объеме кода (отбрасывая саму реализацию класса, поскольку будет бесконечно многократно использоваться).
Я недостаточно заботился о доходности, чтобы попытаться сам, но это должно быть выполнимым. Тем не менее, это также далеко не тривиально, так как член команды C # Эрик Липперт называет это « самым сложным преобразованием в компиляторе ».
Я также пришел к выводу, что с тех пор, как я написал первый черновой вариант этого более года назад, до тех пор, пока не выйдет Visual Studio 2010, это не представляется возможным, так как это потребовало бы отправки нескольких лямбд в класс Iterator и т. чтобы быть действительно практичными, нам нужна поддержка .NET 4 для многострочных лямбд.