Урожай в VB.NET

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

62
задан Peter Mortensen 23 April 2013 в 20:49
поделиться

4 ответа

Примечание: Этот ответ стар теперь. Блоки итератора были с тех пор добавлены к [1 110] VB.NET

, C# переводит ключевое слово урожая в конечный автомат во время компиляции. VB.NET не имеет ключевого слова урожая, но оно действительно имеет свой собственный механизм для того, чтобы безопасно встроить состояние в функции, которая не легко доступна в C#.

ключевое слово C# static обычно переводится в Visual Basic с помощью Shared ключевое слово, но существует два места, где вещи становятся сбивающими с толку. Каждый - это, статическим классом C# является действительно Модуль в Visual Basic, а не Общем классе (Вы думали бы, что они позволили Вам кодировать его так или иначе в Visual Basic, но noooo). Другой то, что VB.NET действительно имеет его собственное Static ключевое слово. Однако Static имеет различное значение в VB.NET.

Вы используете Static ключевое слово в VB.NET для объявления переменной в функции, и когда Вы делаете переменная сохраняет свое состояние через вызовы функции. Это отличается, чем просто объявление частного статического участника класса в C#, потому что статический функциональный участник в VB.NET, как гарантируют, также будет ориентирован на многопотоковое исполнение, в котором компилятор переводит его для использования класса Монитора во время компиляции.

Итак, почему запись все это здесь? Ну, должно быть возможно создать допускающий повторное использование дженерик Iterator<T> класс (или Iterator(Of T) в VB.NET). В этом классе Вы реализовали бы конечный автомат, используемый C#, с Yield() и Break() методы, которые соответствуют ключевым словам C#. Тогда Вы могли использовать статический экземпляр (в смысле VB.NET) в функции так, чтобы он мог в конечном счете сделать в значительной степени то же задание как C# yield приблизительно в том же объеме кода (отбрасывание класса implemenation самого, так как это было бы бесконечно допускающим повторное использование).

я не заботился достаточно об Урожае для попытки его сам, но это должно быть выполнимым. Однако это также совсем не тривиально, как член команды C# Eric Lippert называет это" самое сложное преобразование в компиляторе ".

я также приехал для веры, так как я записал первый проект этого более чем год назад, что это не действительно возможно значимым способом до Visual Studio, 2010 выходит, поскольку это потребовало бы отправки нескольких лямбд к классу Итератора, и так быть действительно практичными нам нужно .NET 4 поддержка многострочных лямбд.

71
ответ дан Joel Coehoorn 24 November 2019 в 16:47
поделиться

Я лично просто пишу свой собственный класс итератора, который наследовался IEnumerator (T). Это действительно берет когда-то для разбираний в нем, но я думаю в конце, лучше записать, что это прямо тогда старается избегать его. Другой метод, который я сделал, должен записать рекурсивный метод, который возвращает IEnumerable (T) и просто возвращает Список (T) и использует.AddRange.

1
ответ дан J. Scott Elblein 24 November 2019 в 16:47
поделиться

Хотелось бы надеяться, это будет вещью прошлого со следующей версией VB. Так как итераторы на самом деле получают много важное с новыми парадигмами (особенно LINQ в сочетании с отложенными вычислениями), это имеет настоящий высокий приоритет, насколько я знаю из блога Paul Vick. С другой стороны Paul больше глава команды VB и у меня еще не было времени для наблюдения переговоров по PCD.

однако, если Вам интересно, они связаны в блог .

Paul
0
ответ дан Konrad Rudolph 24 November 2019 в 16:47
поделиться

Есть хорошая статья Использование итераторов в VB Now Билла Маккарти в Visual Studio Magazine по эмуляции ] yield в VB.NET. Или дождитесь следующей версии Visual Basic.

14
ответ дан 24 November 2019 в 16:47
поделиться
Другие вопросы по тегам:

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