Microsoft. Пространство имен VisualBasic “истинная.NET” код?

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

56
задан MPelletier 30 April 2012 в 04:11
поделиться

13 ответов

Microsoft.VisualBasic.dll <> Microsoft.VisualBasic.Compatibility.dll !!!

(или, если Вы предпочитаете, Microsoft.VisualBasic.dll! = Microsoft.VisualBasic.Compatibility.dll; )

Microsoft. VisualBasic. Совместимость пространство имен исключительно для использования мастером обновления VB6, может быть удалено в будущих версиях и никогда не должно использоваться для новой разработки.

Microsoft. Пространство имен VisualBasic абсолютно, 100%-й истинный.Net, полностью поддерживаемый, и будет вокруг целого.Net, вокруг.

Несколько необходимых ссылок:

Редактирование: Добавленный официальное слово от эта статья MSDN:

Время выполнения Visual Basic обеспечивает конкретную реализацию для глобальных функций Visual Basic и функций языка, таких как Len, IsDate и CStr. И хотя новое Время выполнения Visual Basic предоставляет подобные услуги как своих предшественников, это - совершенно управляемый код (разработанный в Visual Basic.NET), который выполняется на общеязыковой среде выполнения . Кроме того, Время выполнения Visual Basic является частью Платформы.NET, таким образом, это никогда не, что-то отделяется, то Ваше приложение должно нести или развернуться.

и

библиотека Visual Basic 6.0 Compatibility отлична от Времени выполнения Visual Basic. Microsoft. VisualBasic. Пространство имен совместимости используется инструментами, которые обновляют код Visual Basic 6.0 до Visual Basic.NET. Это - мост для поддержки Visual Basic 6 функций, которые непосредственно не поддерживаются реализацией.NET Visual Basic. В отличие от Времени выполнения Visual Basic, на библиотеку совместимости неявно не ссылаются все приложения Visual Basic.NET . При обновлении проекта Visual Basic 6 до Visual Basic.NET мастер обновления добавляет ссылку на Microsoft. VisualBasic. Совместимость.

классы совместимости не должны использоваться для новой разработки . Microsoft. VisualBasic. Пространство имен совместимости добавляет слой сложности к Вашему приложению Visual Basic.NET и представляет некоторые минимальные затраты на производительность, которые могли быть устранены путем перекодирования частей приложения. Кроме того, пространство имен Совместимости часто содержит много классов, которые обертывают COM-объекты, и столь же установленный ранее, в зависимости от COM-объектов не так оптимально как чистая управляемая реализация.

58
ответ дан Community 26 November 2019 в 17:22
поделиться

Используйте Отражатель.NET и посмотрите в него. Я часто делаю это. 9 из 10 вызовов в Microsoft. Пространство имен VisualBasic является просто обертками вокруг методов.NET.

Ваш консультант делает то, что прилагают все усилия консультанты: показ этого он существует для создания бюджета больше. MS больше не поддерживает VB6, но то, что VS 2008 имеет.NET VB, должно указать, что они будут поддерживать.NET VB, по крайней мере, в течение еще нескольких лет.

Лично, я рассматриваю Microsoft. VisualBasic как фасад по другим классам.NET. Я использую его, когда это - персональный проект, и я мог сделать свою работу более быстро и легко, чем использование классов BCL. Хорошим примером является Microsoft. VisualBasic. Строки. Право сравнено со Строкой. Подстрока. Однако для многих функций (как Val) в пространстве имен VB, существует больше устойчивых и мощных версий в менее определенных для языка разделах платформы. Если я пишу код для работы, я не пользуюсь библиотеками VB. Это делает его так, чтобы разработчикам C#, незнакомым с VB, не приходилось тяжелее, понимая мой код.

24
ответ дан OwenP 26 November 2019 в 17:22
поделиться

Я полагаю, что они все компилируют в тот же самый байт-код.

Вот моя ссылка: http://www.codinghorror.com/blog/archives/000128.html

6
ответ дан databyss 26 November 2019 в 17:22
поделиться

Как некоторая функциональность в FCL, части Microsoft. Код пространства имен VisualBasic записан в управляемом коде, часть его, обертки звонят в неуправляемый код.

нет, конечно, никакой зависимости от vb6 времени выполнения, и оно, конечно, не устанавливает vb6 время выполнения бесшумно под шляпой.

необходимо загрузить Отражатель.NET и посмотреть на код в Microsoft. Пространство имен VisualBasic.

, Если Вы хотите продолжить использовать функциональность в этом пространстве имен от C# тогда, продолжают делать так, это не уходит. Некоторый код может быть отмечен как устаревший/устаревший, но я ожидаю через 15 лет, Вы все еще будете в состоянии выполнить то же использование приложений Microsoft. Функциональность VisualBasic без любой проблемы.

Обновленный: А также с помощью отражателя.NET можно теперь видеть/отлаживать источник Microsoft. Код VisualBasic namespace/Microsoft.VisualBasic.DLL:

http://blogs.msdn.com/vbteam/archive/2008/01/19/source-code-of-visual-basic-runtime-has-been-released-to-public.aspx

Идет, захватывают загрузчик массы платформы и просматривают код на Вашем досуге:

http://www.codeplex.com/NetMassDownloader

7
ответ дан Kev 26 November 2019 в 17:22
поделиться

Оператор "Microsoft no longer supports Visual Basic" мог означать несколько вещей, так как существует несколько версий Visual Basic - VB 1 хотя к 6, VBA и VB.NET.

оператор "Microsoft no longer supports Visual Basic.NET" был бы большими новостями, если бы это было верно, , но это не . (Я проверил Google). Поддержка VB6 закончилась, но VB.Net является все еще очень живыми и получающими новыми возможностями.

VB.Net компилирует в байт-код MSIL, который зависит от части из.Net библиотеки, в зависимости от которых .net классов платформы Вы используете. Некоторые из тех библиотек не записаны в чистом.Net или являются просто обертками вокруг Windows API. Это необходимо, так как те функции, которые не встроены в .net (например, распараллеливающий) должны быть представлены ему управляемым способом.

Точно то же верно для C#. Время выполнения действительно не заботится, какой язык генерировал MSIL, который это выполняет.

4
ответ дан Anthony 26 November 2019 в 17:22
поделиться

Цель Microsoft состоит в том, чтобы сделать.NET VB и C# тем же языком с различным синтаксисом. Это верно. Однако изменения всегда закрадываются как новая обработка VB9 литералов XML. То, что он спрашивает, имеют, они повторно реализовали весь СТАРЫЙ VB6 и предыдущую функциональность как управляемый код.NET. Мое предположение было бы нет.

2
ответ дан Nick 26 November 2019 в 17:22
поделиться

Поскольку OwenP заявил, большинство вызовов в Microsoft. Пространство имен VisualBasic является просто обертками вокруг существующей функциональности.NET. Итак, почему создают обертки?

, Когда VB.NET был создан, Microsoft хотела, чтобы разработчики были в состоянии импортировать существующие проекты VB6 в.NET. Это было только выполнимо, если функции VB6 и вызовы метода имели соответствие функциональности в VB.NET. Таким образом, они создали Microsoft. Пространство имен VisualBasic для отображения этого функциональность VB6 на функциональность.NET. (Чистое предположение, но это имеет смысл)

, В то время как.NET прогрессировала в новые версии, они не могли удалить Microsoft. Пространство имен VisualBasic - много кода, вероятно, все еще использует его. Таким образом, это все еще там.

Кроме того, можно записать код VB.Net, даже не используя Microsoft. Пространство имен VisualBasic. (И поскольку Kev подразумевал, можно использовать Microsoft. Пространство имен VisualBasic от C#.) VB.Net является просто языком, платформа.NET остается тем же.

1
ответ дан Tad 26 November 2019 в 17:22
поделиться

Существует набор кода.NET, та Microsoft на самом деле просто обертывает функциональность COM. Я не гуру лицензирования, но Вы могли всегда захватывать Отражатель и смотреть на то пространство имен и лично убеждаться.

0
ответ дан Nick 26 November 2019 в 17:22
поделиться

Я думаю, что хорошее место для запуска было бы документацией MSDN, предоставленной Microsoft о VB.net

http://msdn.microsoft.com/en-us/library/2x7h1hfk.aspx , Что ссылка будет последней Visual Studio, которую 2008 описывает о языке.

VB компилирует то же как C# под CLR, таким образом, я не добираюсь, куда Ваш консультант приезжает отсюда.

0
ответ дан Drakinfar 26 November 2019 в 17:22
поделиться

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

VB.NET казался существенно иным от VB6, когда я в последний раз использовал его, все же.

0
ответ дан Valerion 26 November 2019 в 17:22
поделиться

код VB.NET непосредственно не компилируется в двоичный файл. Это компилируется в (промежуточный язык) IL точно так же, как C#.

, Что, это означает, то, что независимо от того, что Вы создаете в VB.NET, это будет допускающим повторное использование в проектах C# без любых проблем.

я не смог найти любые ссылки непосредственно связанными с тем, что Вы спрашиваете. Главная причина состоит в том, что VB.NET является частью новой активно разработанной платформы. Нет никакого плана сделать тот язык устаревшим. Независимо от того, что другой консультант говорит.

0
ответ дан Maxime Rouiller 26 November 2019 в 17:22
поделиться

Насколько я знаю, VB.NET является 'истинным .net' код, как Вы выразились. Существует много различных языков (C#, VB.NET, F#, Cobol.NET, и т.д.), который кодирует вся 'компиляция' в IL. Это код IL - то, что на самом деле выполняется.NET VM и интерпретируется к машинному коду. Объекты, что Вы взаимодействуете с между языками, являются все еще той же базовой.NET objetcs.

, Например, в C#:

DataTable dt = новый DataTable ();

Компиляции к тому же самому IL кодируют как эквивалент в VB.NET:

Тусклый dt как DataTable = новый DataTable ()

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

Это также означает, что я могу записать одну библиотеку классов в VB.NET "myVbCode.dll", и это непосредственно совместимо с одним записанным в "myCSharpCode.dll" C#. На самом деле оба из DLLs будут только содержать скомпилированный код IL.

могут быть некоторые отдаленные исключения ко всему этому, но существенно именно так это работает.

0
ответ дан CodingWithSpike 26 November 2019 в 17:22
поделиться

Прямой ответ на Ваш вопрос был бы то, что VB.NET является таким же "истинным кодом.NET", как C#.

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

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

0
ответ дан angry person 26 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

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