Почему отсутствует поддержка IntelliSense для C# по сравнению с VB.NET?

Для меня разработка для экосистемы Java оплачивала счета на протяжении многих лет. Однако уже несколько лет я работаю в основном в пространстве .Net. Первоначально мой переход в мир .Net заключался в написании и поддержке кода VB.Net. VS предоставил почти всю хорошую поддержку IntelliSense, которую я ожидал после многих лет работы с комбинацией Eclipse/Java. В конце концов мой работодатель решил заняться новой разработкой на C#. Мое первоначальное впечатление от поддержки IntelliSense для C# было далеко не блестящим. Иногда кажется, что у VS нет фонового компилятора для C#, но иногда он делает что-то умное, указывая на то, что там есть некоторая фоновая обработка, но этого недостаточно, чтобы действительно значительно повысить производительность. Есть ли разумная техническая причина такого несоответствия в отношении поддержки IntelliSense между двумя языками?


person Todd Stout    schedule 04.07.2009    source источник
comment
Единственные недостатки, которые я обнаружил, заключаются в том, что C# является языком с учетом регистра, поэтому иногда я не запускаю его должным образом. Можете ли вы опубликовать пример того, что вы имеете в виду?   -  person Eric    schedule 04.07.2009
comment
Все дело в том, что VB.NET с самого начала имеет фоновую компиляцию.   -  person dr. evil    schedule 05.07.2009
comment
Intellisense C# обновляется после редактирования исходного кода, даже до сборки/перекомпиляции; вот почему я задавался вопросом, не работает ли машина ОП по какой-то причине просто медленно.   -  person ChrisW    schedule 05.07.2009
comment
Я нахожу новое название более ясным.   -  person Richard Berg    schedule 06.07.2009


Ответы (1)


Между C# и VB уже давно существует разрыв. VB генерирует для вас много кода. Например, нажатие клавиши Enter после завершения оператора «Если» автоматически добавит «Тогда» в конце этой строки, если вы его пропустили, и закроет его частью «Конец, если». В C# вы можете добавить эти начальные и закрывающие фигурные скобки {}.

VB имел фоновую компиляцию задолго до C#. На самом деле, это был один из главных привлекательных факторов использования ReSharper, который предоставлял такую ​​функциональность. Однако с VS 2008/.NET 3.5 SP1 все изменилось. Вы можете прочитать сообщение Скотта Гу об этом здесь, но я вставлю соответствующую часть:

«Редактор кода C# теперь идентифицирует и отображает красные волнистые линии для многих проблем семантического кода, для выявления которых ранее требовалась явная компиляция. Например, если вы попытаетесь объявить и использовать неизвестный тип в редакторе кода C# сегодня, вы не видеть ошибку компиляции до тех пор, пока вы не выполните сборку. Теперь с пакетом обновления 1 (SP1) вы сразу увидите живые красные волнистые линии (никакой явной компиляции не требуется)».

Использование CodeRush или ReSharper определенно улучшает работу с автозавершением общих операторов, которые заставят разработчика VB почувствовать плавный переход.

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

«Фоновая компиляция» — это функция VB, которая выдает вам полный набор ошибок при вводе текста. Люди, которые переключаются между VB и C#, замечают это, но разработчики, использующие только VB, могут не понимать, что другие языки, такие как C#, не всегда дают вам 100% точную Intellisense и не всегда дают вам все существующие ошибки. в вашем коде. Это связано с тем, что их механизмы Intellisense представляют собой отдельные компиляторы с уменьшенным масштабом, которые не выполняют полную компиляцию в фоновом режиме. VB, с другой стороны, компилирует весь ваш проект от начала до конца, пока Visual Studio простаивает, что позволяет нам немедленно заполнить список задач абсолютно точными ошибками и предоставить вам полностью точную Intellisense.

Последнее замечание: недавнее интервью Channel9 с руководителем отдела C#/VB/F# Лукой Болоньезе, в котором он подчеркнул, что языки больше не будут расходиться в разные стороны и начнет делиться своими сходствами. Так что, похоже, в будущем нас ждут великие дела!

person Ahmad Mageed    schedule 04.07.2009
comment
В какой-то маленькой банальной области моего мозга раздается тихий голос, который думает, что это плохая идея. Почему? Эти языки не похожи по прагматическим причинам. Им должно быть позволено развиваться независимо. - person Todd Stout; 06.07.2009
comment
Должен признаться, что я еще не читал весь этот ответ, но первый абзац кажется не совсем точным. Вы упомянули то, что по сути звучит как фрагмент кода для оператора If в VB — C# также имеет такие фрагменты: Введите if и нажмите Tab, чтобы сгенерировать весь блок. Есть и множество других подобных фрагментов. - person Ryan Versaw; 08.07.2009
comment
К сожалению, я подозреваю, что это похоронный звон для VB.Net. MS относит его к статусу второго/третьего класса. Я приверженец c/c++/java/c# старой школы (и парень из Unix), но после работы с VB.Net я понял, что это чертовски хороший язык, который имеет незаслуженную дерьмовую репутацию среди многих в сообществе программистов. Я буду скучать. - person Todd Stout; 08.07.2009
comment
@Ryan: я знаком с фрагментами кода, и они полезны, но, как вы сказали, вам нужно нажать вкладку, чтобы сгенерировать их. Мой пример If Then не является фрагментом в этом смысле, но что-то, что IDE делает, когда вы нажимаете правильную комбинацию (без вкладки), точно так же, как IDE переформатирует код C # после закрывающей фигурной скобки / точки с запятой. VB справляется с этим без моего участия, в то время как в C# я скорее наркоман CTRL+K+D. Я думаю, что разработчик VB, переходящий на C#, быстро понимает, как много для него сделал VB. Пример: тривиальная инкапсуляция кода между If Then/End If защищает от непреднамеренных 1-строчных операторов; отсутствие C# {} может привести к проблемам с отладкой - person Ahmad Mageed; 08.07.2009
comment
@Todd: я работал с обоими, но в целом предпочитаю C#. Упомянутый вами негатив, насколько я понимаю, был со времен VB6. Я работал с VB.NET над несколькими проектами и получил некоторое уважение за то, что он пришел с чистого листа (фон C/C++/C#, без VB6). Я действительно сомневаюсь, что в ближайшее время он куда-нибудь пойдет или что C # унаследует его функции, а MS закроет для него занавески. Недавно VB получил XML-литералы, а C# 2.0 — yield. Полезные функции. Я бы приветствовал некоторую конвергенцию с VB, реализующим yield, вместо того, чтобы писать свой собственный конечный автомат для блока итератора. - person Ahmad Mageed; 08.07.2009
comment
@Ahmad: Я не могу сказать, что слишком часто использую VB, поэтому я предполагал, что фрагменты работают одинаково между ними. Спасибо, что прояснили это! - person Ryan Versaw; 08.07.2009