Преимущество C # над VB [закрыто]

Что в C # .NET делает его более подходящим для каких проектов чем VB.NET?

Производительность ?, Возможности ?, Библиотеки / Компоненты ?, Репутация ?, Надежность? Ремонтопригодность? Легкость?

В основном что-нибудьC # может сделать, что невозможно с помощью VB, или наоборот. Вещи, которые вы простодолжен рассмотреть при выборе C # / VB для проекта.

Ответы на вопрос(19)

В C # вы можете более точно настроить управление событиями / делегатами. Но тебе это редко нужно.

Есть много других примеров кода для C #.

В VB.Net (намного) проще использовать позднюю привязку. Например, для COM-объектов (в C # с версии 4.0).

Я использую C # на 90% в своих проектахЯ использую VB.Net для взаимодействия с Excel и т. Д.

Как только я лучше узнаю F #, я, вероятно, буду использовать его для деталей, для которых F # лучше подходит.

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

Даже если вы пишете в VB.NET изо дня в день, вам все равно нужно уметь читать C #

Технически они используют одну и ту же платформу с одинаковыми характеристиками производительности и памяти и системами одного типа, поэтому мне трудно разделить их.

Большинство хороших разработчиков должны иметь возможность переключаться между двумя с несколькими днями настройки времени.

Мое основное разочарование связано с сотнями раз, которые я написал:

String lastName as String

и задавался вопросом, почему это никогда не компилируется!

 Zack Peterson19 янв. 2010 г., 23:00
Это больно, но C # - король. Я ненавижу ошибки с запятой и чувствительность к регистру. Я думаю, что многословие VB делает его более читабельным.

Вот еще один момент, еще не рассмотренный в этом следе:

Более высокая степень трудоустройства + лучше (больше) Ресурсы разработчика

Однако сейчас я не согласен с этой точкой зрения:

Есть больше магазинов C # Dev, что магазины VB

Некоторые отсталые работодатели c # поставят вас в серьезное невыгодное положение, если вы сильнее с VB. Так что, возможно, C # - лучший выбор здесь.

С другой стороны, когда вы будете нанимать людей для своего проекта на C #, вы сможете привлечь больше кандидатов на просмотр и в результате получить лучшие навыки - я не думаю, что детали следует упускать из виду.

Решение Вопроса

C # и VB в основном одинаковы, но есть небольшие отличия. Помимо очевидных грамматических различий у вас есть следующие различия:

C # может вызвать небезопасный кодVB имеет необязательные параметры (в C # 4.0)VB проще в использовании при выполнении вызовов с поздним связыванием (в C # 4.0). Это и номер 2 делают использование VB для автоматизации делопроизводства намного чище.В VB есть куча «вспомогательных» функций и классов, таких как пространство имен My; однако все это доступно для C #VB нечувствителен к регистру

Синтаксис C # соответствует грамматике, аналогичной c и java, что делает его гораздо более удобным переходом с тех языков, где VB может быть более удобным для пользователей VB. Что касается производительности, то и библиотеки или компоненты у них практически идентичны.

Что касается того, какой из них выбрать, если у вас нет необходимости выполнять небезопасные операции, то выберите язык, который наиболее естествен для вас. После многих лет работы в качестве разработчика VB мне не нравилось писать If yadada затем ..... End If if (yadaya) {....} спасает мой запястный канал несколькими дополнительными нажатиями клавиш (которые затем можно использовать при ответе на SO). вопросы)

редактировать

Только что узнал еще одно различие между C # и VB в том, что VB поддерживает отфильтрованные исключения, так что вы можете сделать что-то вроде этого:

try
{
   //do something that fails
}
catch(Exception ex when ArgumentException, 
      ArgumentNullException, FormatException)
{
  //Only handle these three types
}

Это не следует путать со способностью делать:

try
{ 
    //something that fails
}
catch(ArgumentException)
{ 
    //Log Error
}
catch(ArgumentNullException)
{
    //Log Error
}

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

редактировать

Еще немного отличий.

Оператор VB Is сравнивает два объекта, чтобы определить, являются ли они одинаковыми, он компилирует в инструкцию CEQ IL, где C # компилируется в isinst IL. Таким образом, следующие эквивалентные утверждения

C #if (foo is FooObject){}

В.БIf TypeOf foo is FooObject then

Также, как упоминалось в комментариях, и я хотел бы видеть их, чтобы дать вам кредит, но C # не имеет подобного параметра. Вам нужно использовать класс RegEx.
 JoshBerke19 дек. 2008 г., 14:48
@Chris: правда, я пытался добавить немного юмора. Хотя для читабельности у вас может быть смысл, но все это субъективно. Это один из моментов, когда MS хорошо поработали, поставив оба языка в равное положение. Так что теперь это только ваше личное мнение
 JoshBerke22 февр. 2009 г., 23:11
хех, я парень на C #, вот почему.
 JoshBerke19 дек. 2008 г., 08:32
не шучу, мне не придется смотреть на классы с 30 конструкторами, охватывающими все возможные перестановки параметров
 JoshBerke06 мар. 2009 г., 16:01
C # будет необязательным в 4.0. C # также имеет оператор is. C # также может явно реализовывать интерфейс как interface.method.
 CodeAndCats19 дек. 2008 г., 08:19
Woot, наконец, C # получает необязательные параметры? О бешеное время! лол: D
 Rune Grimstad19 дек. 2008 г., 08:34
Вы уверены, что VB нечувствителен к регистру? Я думал, что только Visual Studio исправила регистр ваших переменных и методов для вас.
 JoshBerke19 дек. 2008 г., 08:36
Я сделал это по памяти и 2:30 утра, поэтому может быть неправильно, дайте мне Google, что
 Mehrdad Afshari19 дек. 2008 г., 08:38
Руна, VS исправляет это, чтобы сделать код красивее и согласованнее. Но до сих порdataset а такжеDataSet это одно и то же.
 Joseph Ferris19 дек. 2008 г., 13:44
Я могу жить без дополнительных параметров. Я предпочитаю перегрузки. Если сигнатура слишком сложна и требует слишком большого количества вариаций, это определенный запах кода.
 Binoj Antony22 февр. 2009 г., 21:26
Странно, но ваш псевдо для VB находится в C # :)
 splattne19 дек. 2008 г., 10:51
Я программирую в VS / VB.NET. Каждый раз, когда я переключаюсь на C # в VS, я задаюсь вопросом, насколько лучше интеграция VS Intellisense в VB.NET. Не так ли?
 Matt Sach19 янв. 2010 г., 11:49
C # может использовать несколько блоков catch, чтобы перехватывать исключения разных типовtry {...} catch (ArgumentException ex) {...} catch (FormatException ex) {...} и т.д. Не уверен, что он может использоватьwhere предложение для захвата нескольких типов исключений в одном блоке, как вы продемонстрировали в VB, хотя.
 Botz300007 июн. 2009 г., 06:01
Я думаю, он имел в виду возможность реализации методов интерфейса, используя другое имя (хотя я бы не стал делать это лично)? Я не знаю VB, но я думаю, что у IL есть ключевые слова, которые делают именно это.
 ChrisA19 дек. 2008 г., 09:00
@Josh re carpal tunnel: Intellisense и AutoComplete настолько хороши в VE IDE VS2008, что фактическая типизация для операторов конечного блока равна нулю, если вы все сделаете правильно - она ​​помещает их все для вас. Кроме того, удобочитаемость IMO лучше, так как конечные блоки отличаются, а не просто вложенные
 JoshBerke19 дек. 2008 г., 08:38
petesbloggerama.blogspot.com/2007/04/... - Да, это так ... и, поскольку C # чувствителен к регистру, поскольку блог указывает на my.A и my.a в C #, это две разные вещи, но это вызовет рвоту VB
 Gene Roberts19 дек. 2008 г., 17:16
@ Splattne: я считаю, что это совсем наоборот. C # intellisense, кажется, отлично, в то время как я почти ничего не могу сделать с VB
 Craig Gidney06 мар. 2009 г., 06:51
VB имеет оператор "is", C # должен использовать referenceEquals [== может быть переопределено]. Есть ли у C # «нравится»? Я не помню VB имеет функции-обработчики и реализует модификаторы interface.method для функций. Очень, очень полезно. VB имеет опцию () для вызовов свойств / функций. Делает рефакторинг намного проще.
 splattne21 дек. 2008 г., 11:39
@phoenixredeemer: очень странно. Мы должны обменяться некоторыми скринкастами, чтобы показать нашу точку зрения. Может быть, мы оба терпим неудачу, делая что-то не так. ;-)

Уличный кредит среди гиков.

(И не притворяйся, что это не важно!)

 Robinicks30 дек. 2008 г., 21:57
Да ладно, что должно заботить рационального программиста о каком-то «уличном креде», если он действительно просто хочет, чтобы работа была выполнена хорошо. Теперь, если менеджеру проекта нравится C #, это что-то еще :)
 IAbstract02 дек. 2010 г., 22:14
Я не могу помочь, но чувствую, что теряю некоторую мощь кодирования, когда перехожу на VB из C #.

Я думаю, что Джош дал хороший обзор языковых различий.

Поддержка инструментов

Однако существуют и различия в том, как Visual Studio обрабатывает эти языки. Фрагменты кода проще в использовании из редактора C #, а рефакторинг также лучше.

VB-редактор упрощает intellisense, не показывая все параметры в любое время.

Я уверен, что есть еще вещи, но это те, которые я, как C # 'er (делаю очень мало VB), заметил.

Другие рассмотрели много различий - как уже было сказано несколько раз, ониоколо эквивалентные языки. Несколько различий, которые не были рассмотрены, насколько я видел:

VB9 имеет:

XML-литералыИзменяемые анонимные типы (urgh)Больше поддержки LINQ вязык (C # охватывает только несколько операторов)Целая куча дополнительных битов в языке, которые компилируются в вызовы сборки Microsoft.VisualBasic. (C # предпочитает быть небольшим языком с весом .NET Framework).Литералы DateTime

C # 3 имеет:

Лучшая поддержка лямбда-выражений: IIRC, вы не можете написать лямбда-выражение с блочным телом в VB.Блоки итераторов.Синтаксис для методов расширения (вместо украшения метода атрибутом)

Я подозреваю, что есть больше, но я думал, что просто добавлю это в микс.

 Jonathan Allen31 дек. 2008 г., 23:43
Сборка Microsoft.VisualBasic является частью .NET Framework, и многие программы на C # ее используют.
 Steve Horn24 мар. 2010 г., 16:51
Блоки поддержки лямбд VB10 (несколько строк). Это для функции и саб.
 Jonathan Allen31 дек. 2008 г., 23:44
Добавить: C # работает на платформах, которые не поддерживают VB, таких как XNA / XBox 360.

В ранних версиях VB.NET разница была более очевидной, однако с текущей версией существенных различий нет.

VB поддерживает литералы XML непосредственно в коде, который не поддерживается C #. C # поддерживает небезопасный код, а VB - нет. Технически эти два - самые большие различия. Есть много небольших вариаций, но они не важны. Мне больше нравится C #, потому что я думаю, что синтаксис гораздо менее раздутый. Легко распознавать блоки кода вместо того, чтобы видеть кучу ключевых слов, но это чисто личное предпочтение.

Выберите тот, который вам и вашей команде более знаком.

 splattne19 дек. 2008 г., 13:04
_ не является ненужным. Это делает ";" в конце вашей «линии программирования» устарела В 99% случаев вам не понадобится _
 kenny19 дек. 2008 г., 14:11
То же самое касается '_', но я думаю, что XML-литералы - хорошая идея.
 Mehrdad Afshari19 дек. 2008 г., 13:36
Я согласен с Крисом, особенно сегодня, с LINQ, это действительно грязно с _
 Ryan Lundy19 дек. 2008 г., 17:15
Крис ... ты на самом делеиспользуемый XML литералы в VB .NET?
 Chris19 дек. 2008 г., 09:28
XML-литералы в коде - это УЖАСНАЯ идея и мерзость для языка IMO. Я никогда не был поклонником VB, но это в значительной степени запечатало сделку. Кроме того, весь _ для переноса однострочного оператора довольно ненужен.

Я думаю, что это сообщение в блоге Кэтлин Доллард дает отличный обзор вопроса:

Что должен знать C # кодер, прежде чем писать VB

и ее первый совет:

1) Преодолеть уважение или бросить, прежде чем начать. VB отличный язык.

 Dscoduc06 мар. 2009 г., 16:24
+1 - Отличный пост, но ненавижу цветовую схему своего сайта (не то, чтобы это имело значение) ...
 Booji Boy19 дек. 2008 г., 17:31
Я люблю свой VB.NET. Это отличный пост. +1
 kenny19 дек. 2008 г., 14:16
+1 Отличная ссылка! Спасибо, и я предпочитаю C #, время, чтобы узнать немного больше VB.NET.

Спектакль?

Без разницы, хотя VB исторически использует странное индексирование в циклах, что означает, что вы должны вычитать 1 из самого высокого индекса в большинстве случаев:

For i = 0 To someArrayOrString.Length - 1 …

Хотя я сомневаюсь, что это влияет на производительность влюбой измеримым образом.

С другой стороны, из-за фоновой компиляции VB фактически компилируетсяБыстрее, Некоторые люди утверждают, что это заставляет IDE реагировать вяло, но я никогда сам этого не замечал.

Возможности?

В нескольких случаях C #yield Заявление действительно полезно. VB требует больше ручной работы здесь. Кроме того, лямбды намного лучше реализованы в C #, особенно синтаксически. Рассмотрим эти два утверждения:

Parallel.For(1, 10000, i => {
    // Do something
});

против

Parallel.For(1, 10000, Sub() _
    ' Do something '
End Sub)

Помимо того факта, что VB пока не может этого сделать, и что комментарии в этом месте запрещены, это всего лишь беспорядок и, как правило, запрет.

Библиотеки компонентов /?

Идентичный.

Репутация?

Не важный. «Уличный кредит»? Сожалею. Не фактор. Преодолей это, Ник.

Надежность? Ремонтопригодность? Простота?

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

Свободное от старого Cruft, объявление массива в C # не дополняется дополнительным элементом. Массив VB.NET дополняется дополнительным элементом, что упрощает перенос устаревшего кода VB6.

C # более последовательный, чем VB.NET

Button1.Color() = Color.Red
Button1.Color = Color.Red

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

Согласованность с экземпляром и статическими членами. VB.NET позволяет получить доступ к статическим членам, например, пряжа. Спит (1000), это неудача.https://stackoverflow.com/questions/312419/language-features-you-should-never-use

 RolandTumble19 мая 2009 г., 19:41
Нет, объявление массива НЕ "дополнено дополнительным элементом". Это просто меняетимея в виду декларации. Вместо того, чтобы «объявлять это множество элементов», вы пишете «объявлять массив до этого последнего элемента». Не то же самое, что "padding", хотя этоМожно быть таким же запутанным ....

Когда вы сталкиваетесь с проблемой, вы часто можете найти в Google пример кода, который показывает, как решить ее за считанные минуты. Это важный фактор повышения производительности. Когда я работал с Delphi, мне приходилось конвертировать примеры кода из C в Object Pascal - выполнимо, но утомительно, то есть много трений. Так что не стоит недооценивать тот факт, что ...

Подавляющее большинство примеров кода .Net находятся на C #!

 Konrad Rudolph19 дек. 2008 г., 18:58
Верно и важно, поэтому каждый программист на VB должен знать C # - и наоборот.
 IAbstract02 дек. 2010 г., 22:15
@Konrad: поскольку мой менеджер по разработке является VB-кодером, мне пришлось много работать с VB-to-C # -to-VB. Это, безусловно, помогает быть в состоянии идти вперед и назад.
 Robinicks30 дек. 2008 г., 22:07
@ Майк и Конрад - я согласен! VB <> C # это важная вещь. Интересно, почему они не учат их вместе, так как они так похожи?

Я должен сказать, что мой опыт использования Google для поиска примеров или документации заключается в том, что примеры на C # имеют лучшее качество, чем примеры на VB. Это не значит, что есть неплохие примеры на C #, но если вы ищете что-то вроде «словаря выпадающего», добавление C # обеспечит более качественный ответ выше в списке.

Это не относится к примерам, которые отображают код C # и VB рядом.

Моя любимая особенность C #, которой нет у VB - это оператор yield. Это позволяет легко возвращать лениво оцененный IEnumerable из метода.

Вот статья, которая покрывает это:http://msdn.microsoft.com/en-us/magazine/cc163970.aspx

VB.Net имеет корневое пространство имен, а C # имеет пространство имен по умолчанию, которое не совпадает. Потому что, когда у вас есть корневое пространство имен в VB.Net, оно всегда будет добавлять его перед пространством имен.

Например: если у вас есть rootnamepsace в VB.Net с именем namespace1, а затем вы добавляете это в свой файл.

Namespace namespace1
  Public Class class1
  End Class
End Namespace

тогда вам придется ссылаться на него как namespace1.namespace1.class1

в C #, если у вас есть пространство имен по умолчанию namespace1, и вы это в своем файле.

namespace namespace1{
  public class class1{}
}

Тогда вы все еще можете просто назвать его как namespace1.class1

 BradC30 дек. 2008 г., 22:34
Это проблема с настройками по умолчанию Visual Studio, а не с языком VB.net. Это можно удалить.

Поскольку C # и VB.Net оба компилируются в MSIL, оба имеют практически одинаковую производительность, возможности, библиотеки и компоненты. Reflection может деассемблировать код MSIL на C # или VB.NET (или на ряде других языков).

Это в основном оставляет нас, C # очень похож на Java и C ++, что придает ему больше доверия.

 bart19 дек. 2008 г., 09:32
@ Марк: Вау. Если у вас есть скобки или нет, ваш мозг заикается, ваши языки слишком похожи. И ваш Perl, скорее всего, не очень Perlish (таким образом: плохое качество).
 James Curran19 дек. 2008 г., 15:28
@bart: я написал очень на C ++ - как на Perl, просто изменив форматирование. Как это делает это "плохим качеством"
 Robinicks19 дек. 2008 г., 08:25
«Доверие»? В каком смысле?
 Jon Skeet19 дек. 2008 г., 09:21
@James: То, что они компилируются в IL, не означает, что они эквивалентны, как вы предполагаете. Это все равно что сказать, что C # 2.0 и C # 3.0 одинаковы - все, что было добавлено, это синтаксический сахар, но это довольноважный синтаксический сахар.
 Eric Haskins19 дек. 2008 г., 08:33
@ Джереми Радд «доверие» в том смысле, что есть большое количество программистов, которые считают, что если у языка нет фигурных скобок и точек с запятой, то это должен быть «игрушечный» язык. Если вы не можете сказать, я не согласен.
 Mark Allen19 дек. 2008 г., 08:47
Я бы сказал «комфорт», прежде чем «доверие». С C # мне не нужно сильно напрягать мозг, чтобы перейти с C ++ на JScript на C # или даже на Perl, который вы можете написать аналогичным образом.

Насколько я понимаю, между языками есть различия, хотя они минимальны. Я бы предложил работать с языком, который вам / вашим разработчикам будет наиболее удобен. Если у них уже есть опыт работы с VB, я бы предложил VB.Net/vice-versa.

Хотя я предпочитаю краткий синтаксис C # лично. :)

 TheAgent19 дек. 2008 г., 09:39
Чтение кода VB похоже на то, что ваш друг говорит с вами! Это просто все "{" заменено на "Тогда"! Ничего страшного.
 JaredPar19 дек. 2008 г., 08:35
если вам нравится краткость, попробуйте F #. Это делает C # похожим на многословного профессора истории

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

Это решено в VB.Net 10.0.

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

 chrissie119 дек. 2008 г., 12:24
@ Джереми - я никогда не замечал этого, и у меня есть проект 700000 Loc в VB.Net.
 Robinicks19 дек. 2008 г., 10:34
Компиляция времени редактирования на самом деле является проблемой для больших проектов, поскольку она значительно снижает производительность IDE.
 Robinicks30 дек. 2008 г., 22:03
@ chrissie1 - время редактирования, только текущий отредактированный файл перекомпилируется. У меня был проект с 20000 LOC в одном классе, в одном файле, и, поверьте мне, даже на моем 3Ghz, его было медленно редактировать, даже медленно печатать! Позже я разделил этот класс на несколько файлов, используя «Частичный класс».
 Andy McCluggage19 дек. 2008 г., 10:13
С ReSharper это не проблема. Я не мог жить без этого сейчас.
 Powerlord19 дек. 2008 г., 15:16
Я слышал, что эта проблема была устранена в VS2k8SP1, но мы до сих пор не обновили ее до этой версии.
 ChrisA19 дек. 2008 г., 09:04
Правда. У меня нет религиозных возражений против C # как языка - я использую в основном VB.NET, но C # подходит, когда мне это нужно. Но система прекомпиляции / intellisense / автозаполнения в VB IDE намного, намного лучше. Когда в начале этого года я использовал C # по контракту, использование IDE VS2008 было похоже на возвращение на 5 лет назад.
 Robinicks30 дек. 2008 г., 22:11
@ chrissie1 - .. и тогда это было работоспособно. Теперь, если вы сравните это с большим проектом с сотнями МАЛЫХ КЛАССОВ (до 1 КБ строк?), Это совершенно другой процесс (больше рекурсии?) Для компилятора реального времени VB.NET (на самом деле компилятор времени редактирования VS).
 Arjan Einbu19 дек. 2008 г., 10:15
Странно ... Это то, что я чувствую, когда занимаюсь VB ... (возвращаясь к 5 годам) (Возможно, нам не хватает различных функций, которые мы считаем само собой разумеющимися в нашей повседневной работе ...)

Ваш ответ на вопрос