Подтвердить что ты не робот

В чем преимущества С# over, скажем, delphi/realbasic для приложений Windows

Кто-нибудь когда-либо писал приложение больше, чем его чемодан? Люди критиковали VB6 за 2 Мб, но он редко затмевал приложение, которое оно сопровождало.

Сегодня, несмотря на наличие Vista на моей машине, мне пришлось загрузить 35 МБ фреймворка 3.5 и перезагрузиться, чтобы затем попробовать приложение на половину этого размера.

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

Что лучше в .NET, которое превосходит эти недостатки, когда дело доходит до написания приложений для работы в Windows?

4b9b3361

Ответ 1

ЛЮДИ: Обратите внимание, что это было написано в феврале 2009 года, и то, что было сказано, было подходящим в то время - кричать на меня в конце 2012 года (3+ года позже) не имеет смысла.: -)

Delphi имеет некоторые значительные преимущества для Win32. Не то, что .NET-приложения по своей сути плохо, но попробуйте:

  • работает приложение .NET(любая версия) на Win95/ME, где .NET не существует (AFAIK)
  • распространение любого небольшого (< 1,5 МБ).NET-приложения (да, дисководы гибких дисков все еще существуют)
  • предоставление любого приложения .NET в системе, которая не имеет доступа в Интернет (да, они существуют)
  • распространение ваших приложений .NET в странах без широкой полосы пропускания.
  • чтобы люди не видели ваш исходный код, не тратя кучу теста (Reflection, кто-нибудь?)

Сбор мусора в .NET может быть очень приятным, но любой, кто знает что-либо о программировании, также может легко обрабатывать ручное распределение/освобождение памяти с помощью Delphi, а GC доступен со ссылками-счетными интерфейсами. Разве это не одна из вещей, которая привела всех не-программистов к распространению псевдо-GC VB? IMO, GC - одна из вещей, которая делает .NET опасным, так же, как и VB, это опасно - это делает вещи слишком легкими и позволяет людям, которые действительно не знают, что они делают, чтобы написать программное обеспечение, которое в конечном итоге создает беспорядок. (И, прежде чем я пригоню к смерти здесь, это здорово для людей, которые do знают, что они делают, а также VB; я просто не уверен, что преимущество опытные перевешивают опасности для нас от неквалифицированных.)

Delphi Prism (объекты AKA Rem Objects Oxygene, ранее Chrome) предоставляет версию Delphi для GC, которая нужна тем, кто в ней нуждается, наряду с ASP.NET и WPF/Silverlight/CE с читабельностью (и отсутствием фигурных скобок ) Delphi. Для тех (как я), для которых поддержка Unicode не является основным фактором, Delphi 2007 предоставляет ASP.NET и VCL.NET, а также собственную поддержку Win32. И в таком месте, где я работаю, когда рабочие станции обновляются только (как минимум) каждые три года, и где мы просто избавились от последней машины Win95, потому что это не было приоритетом для обновления,.NET framework вопрос. (Особенно с требованием прокси-сервера компании, позволяющим доступ к Интернету нескольким людям, ограничение пропускной способности и возможностей загрузки, а также правильные учетные записи без администрирования без использования USB-устройств, все еще запущенные в сети Netware - не такие, как Windows Update, и никогда не вирус, потому что ничего не происходит.)

Я работаю на языках .NET(С#, Delphi Prism), но хлеб и масло как на полный рабочий день, так и на стороне происходит от Win32 и Delphi.

Ответ 2

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

  • Управляемая среда чаще ловит распространенные ошибки и дает новые возможности:

    • Сильная типизация позволяет избежать обращения к одному типу как к другому неправильно
    • Сбор мусора в значительной степени устраняет проблемы управления памятью (не полностью, я с готовностью соглашусь).
    • "Ошибка сегментации" обычно переводится как "NullReferenceException", но гораздо проще отлаживать!
    • Отсутствие вероятности переполнения буфера (конечно, без возможности ошибок CLR) - это немедленно устраняет серьезную проблему безопасности
    • Модель декларативной безопасности и хорошо продуманная среда выполнения позволяют выполнять код под различными уровнями доверия.
    • JITting позволяет CLR использовать возможность работы на 64-битной машине без необходимости перекомпиляции (кроме некоторых ситуаций взаимодействия)
    • Будущие разработки процессоров также могут быть нацелены на JITter, предоставляя улучшения без какой-либо работы со стороны разработчика (в том числе нет необходимости перестраивать или распространять несколько версий).
    • Отражение позволяет использовать всевозможные вещи, которые невозможны или трудны в неуправляемых средах.
  • Современная объектно-ориентированная структура:

    • Дженерики с указанием времени выполнения (в отличие от стирания стилей в Java)
    • Разумная поддержка потоков, с новым набором примитивов (Parallel Extensions), входящими в .NET 4.0
    • Поддержка интернационализации и Unicode с самого начала - только один тип строки, чтобы рассмотреть, с одной стороны:)
    • Windows Presentation Framework предоставляет современную инфраструктуру графического интерфейса, позволяющую использовать декларативный дизайн, хорошую компоновку и поддержку анимации и т.д.
    • Хорошая поддержка для взаимодействия с родными библиотеками (например, P/Invoke лучше, чем JNI)
    • Исключения более информативны (и с ними легче справиться), чем коды ошибок.
    • LINQ (в .NET 3.5) обеспечивает прекрасный способ работы с данными в процессе, а также предоставляет различные возможности для работы с базами данных, веб-сервисами, LDAP и т.д.
    • Делегаты допускают несколько функциональный стиль кодирования от VB и С#; это лучше в С# 3.0 и VB9 из-за лямбда-выражений.
    • LINQ to XML - это самая красивая библиотека XML, которую я использовал
    • Использование Silverlight в качестве инфраструктуры RIA позволяет вам делиться большим количеством кода между вашим легким клиентом и другими методами доступа.
    • В основном хорошая история версий, включая переадресацию перенаправления, предпочтение времени выполнения и т.д.
  • Одна структура, ориентированная на несколько языков:

    • Упрощение обмена компонентами, чем с (скажем) COM
    • Выбор языка зависит от заданий и опыта команды. Это будет особенно важно с .NET 4.0: где функциональный язык более уместен, используйте F #; где динамический язык более уместен, используйте IronRuby или IronPython; легко взаимодействовать между всеми языками
    • Честно говоря, я просто думаю, что С# - гораздо более чистый язык, чем VB или С++. (Я не знаю Delphi, и я слышал хорошие вещи об этом, хотя - и, эй, вы можете нацелиться на .NET с Delphi в любом случае.)

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

Чтобы решить две конкретные проблемы, которые вы упомянули в вопросе:

  • Если ваш клиент работает с Vista, у них уже есть .NET 3.0. Если они работают под управлением XP SP2 или SP3, они, вероятно, имеют как минимум .NET 2.0. Да, вам нужно загрузить новую версию фреймворка, если вы хотите ее использовать, но я рассматриваю это как довольно маленькую проблему. Я не думаю, что имеет смысл сравнивать размер вашего приложения с размером рамки. Вы сравниваете размер вашего приложения с размером операционной системы или размером вашей среды разработки?
  • Я не рассматриваю декомпиляцию как почти такую ​​проблему, как большинство людей. Вам действительно нужно подумать о том, чего вы боитесь:
    • Если вы боитесь, что люди копируют ваш фактический код, обычно проще с нуля писать код, если вы знаете о базовом дизайне. Имейте в виду, что декомпилятор не даст локальных имен переменных (при условии, что вы не распространяете свой PDB) или комментарии. Если исходный исходный код так же легко понять, как декомпилированная версия, у вас больше проблем, чем пиратство.
    • Если вы боитесь, что люди обойдут свое лицензирование и пиратствуют ваш код, вы должны иметь в виду, сколько усилий было сделано для того, чтобы остановить людей от пиратских родных приложений - и насколько они неэффективны.
    • Большая часть использования .NET находится на сервере или для внутренних приложений - ни в одном из этих случаев не возникает проблема декомпиляции.
    • Я написал больше на эту тему в этой статье о декомпиляции и обфускации.

Ответ 3

Чтобы назвать несколько:

  • Автоматическое управление памятью, сбор мусора
  • Тип безопасности
  • Проверка границ
  • Доступ к тысячам классов, которые вам не нужно создавать

Ответ 4

ОК сначала, ни один язык/платформа никогда не будет универсально выше.

  • Специализация всегда обеспечит лучший вариант использования в определенных областях, но языки общего назначения будут применимы к большему количеству доменов.
  • Многопарадигменные языки будут страдать от сложных граничных случаев между парадигмами, например.
    • Тип вывода на любом функциональном языке, который также позволяет ООП при представлении подклассов
    • Грамматика С++ удивительно сложна, это напрямую влияет на возможности ее цепочки инструментов.
    • Сложности понимания сложностей дисперсии co/contra в сочетании с дженериками в С# очень трудно понять.

Пожилые языки будут иметь существующие базы кода, которые работают, это и положительно (опыт, хорошо протестированный, обширная вспомогательная литература), но и негатив (результирующая инерция против изменений, несколько разных способов сделать что-то, что приводит к путанице для новых участников).

Выбор/использование обоих языков и платформ - это, как и большинство вещей, балансирование плюсов и минусов.

В следующих списках Delphi имеет одни и те же плюсы и минусы, но также и на многих.

Потенциальные Отрицательные .Net(если они не являются для вас проблемой, они не являются негативами)

  • Да, вам нужно, чтобы среда выполнения была развернута (и установлена), и она большая.
  • Если вам нужен язык с множественным наследованием, вы не получите его
  • Библиотека библиотек BCL имеет некоторые серьезные недостатки
  • Широко не поддерживается за пределами универсальной системы MS (моно - отлично, но значительно отстает от официальной реализации)
  • Потенциальное обременение патентов/авторских прав
  • Время запуска (игнорирование ngen) всегда будет медленнее, и потребуется больше памяти.

Есть больше, но это основные моменты.

Потенциальные Положительные (опять же, если они не важны для вас)

  • Универсальный GC, не подсчет ссылок, который предотвращает использование определенных структур данных, я не знаю широко используемого функционального языка без GC, я не могу думать о значительном языке за последние 10 лет без по крайней мере необязательного GC. Если вы считаете, что это не имеет большого значения, вы, кажется, находились в меньшинстве.
  • Большой BCL (некоторые части не так хороши, как другие, но очень широкие).
  • Огромное количество языков (и удивительное количество парадигм) можно использовать и взаимодействовать друг с другом (я использую С#, f #, С++/CLI в одном более широком приложении, используя каждый, где он имеет наибольший смысл, но может легко использовать аспекты одного из другого).
  • Полнофункциональная интроспекция в сочетании с декларативной поддержкой программирования. Таким образом, широкий спектр рамок становится намного проще и проще в использовании.
  • Jitted - изменения в базовой архитектуре ЦП могут быть в значительной степени прозрачными, возможны сложные оптимизации времени выполнения, недоступные для предварительно скомпилированных языков (в настоящее время java делает это лучше).
  • безопасность доступа к памяти
  • Загрузка Fusion dll и GAC для системных dll

Точно так же для С#

Con:

  • Синтаксис, основанный на основах C
  • (pre 4.0) позднее связывание только через наследование
  • Более подробные, чем некоторые императивные языки
  • плохое управление сложными встроенными литералами (регулярные выражения/xml/многострочные строки)
  • захват переменной внутри замыканий может запутать
  • Вложенные генераторы являются громоздкими и выполняются ужасно

Pro:

  • Синтаксис, основанный на основах C
  • Многофункциональная поддержка через lambdas
  • Выражения, позволяющие проверять время компиляции областей без кода, таких как Linq to SQL
  • Сильно напечатано, но с некоторыми выводами типа, чтобы сделать это проще
  • если вам действительно нужно небезопасно, есть для вас
  • взаимодействие с существующим кодом С++ ABI через P/Invoke является простым и понятным.
  • построена мультивещательная модель событий.
  • генерация кода времени легкого веса

Основы C на самом деле - про и con. Это понятно большому числу программистов (по сравнению с стилем на основе паскаля), но имеет определенное количество трещин (операторы switch - ясный пример).

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

Для многих внутренних приложений Business of Business огромное количество платформы .Net Cons абсолютно несущественно (контролируемое развертывание является общей и хорошо разрешенной проблемой внутри корпораций). Как таковой, используя .Net(и это в значительной степени означает С#, извините, ребята из VB.Net) - довольно очевидный выбор для новой разработки в архитектуре Windows.

Ответ 5

"Простота" разработки сложных (и простых) приложений, использующих его. Многие базовые вещи уже закодированы для вас в рамках, и вы можете просто использовать его. И загрузка 35-мегабайтного файла сегодня намного проще, чем файл 2mb 8-6 лет назад.

Ответ 6

Есть много причин. Я не знаю много о RealBasic, но что касается Delphi:

  • Менее распространено, чем .NET, меньшее сообщество разработчиков. Многие из ресурсов Delphi в сети являются древними и устаревшими.

  • До Delphi 2009 Delphi не имела полной поддержки юникода.

  • Я не знаю о Delphi 2009, но в 2007 году не было очень хорошей сборки мусора. У него был какой-то неуклюжий подсчет ссылок, который требовал некоторого вмешательства от имени разработчика. У .NET есть намного более продвинутый GC, который делает практически все для вас.

  • .NET имеет большую стандартную библиотеку и более современные сторонние библиотеки.

  • Языки .NET, такие как С#, возможно, лучше и, конечно же, легче понять для тех, кто не знаком с языком.

Ответ 7

Здесь много предполагаемых преимуществ, которые приводятся разработчиками .NET, которые не должны быть в этом сравнении, просто потому, что у них есть и Delphi:

  • Тип безопасности
  • Проверка границ
  • Доступ к тысячам классов (компонентов), которые вам не нужно создавать

Однако в .NET есть некоторые вещи, которые Delphi не имеет вне коробки, и только некоторые из них могут быть добавлены библиотеками и собственным кодом. Чтобы назвать несколько:

  • Поддержка нескольких языков, работающих поверх одной и той же среды выполнения, что позволяет выбрать подходящий язык для проблемы (например, функциональное программирование с использованием F #)
  • Генерация и компиляция динамического исходного кода - это что-то настолько странное для программистов Delphi, что они, вероятно, даже не видят, как это может быть полезно [1]
  • События многоадресной рассылки
  • Улучшенная поддержка многопоточности (например, класс BackgroundWorker, асинхронные делегаты)
  • Полная поддержка как 32-разрядных, так и 64-разрядных процессов.
  • Слабые ссылки

[1] Если вы не знаете, но интересуетесь, посмотрите домашнюю страницу Marc Clifton, особенно статьи о декларативном программировании.

Изменить: Я хотел бы ответить на комментарий Мейсона Уилера:

  • Re динамический код: я знаю, что есть решения для встроенного в приложение сценариев Pascal. Тем не менее, существует четкое различие между тем, как сделать части вашей внутренней иерархии объектов доступными для механизма сценариев, и иметь тот же самый компилятор, который используется для вашего кода, доступного и во время выполнения. Всегда существуют различия между компилятором Delphi и компилятором механизма сценариев. Во всяком случае, то, что вы получаете с .NET, выходит далеко за рамки всего, что доступно для Delphi. И вообще, неважно, можно ли скомпоновать аналогичную инфраструктуру для Delphi, дело в том, что с .NET она уже существует для вас, когда вам это нужно.

  • Re Многоадресные события: точно, есть способы его кодирования, но это не часть Delphi/VCL из коробки. Это то, о чем я говорил выше.

  • Re слабые ссылки: Вы грустно ошибаетесь. Попытайтесь использовать интерфейсы нетривиальным способом, создавая круговые ссылки на этом пути. Затем вам нужно начать использовать приемы типов и пожелать слабые ссылки.

Ответ 8

Ну,.NET Framework используется для всех приложений .NET, поэтому у вас есть только один раз на вашем компьютере, а 35 МБ сегодня ничто (сравните его с размером вашей установки Vista). Для вашего второго приложения .NET вам больше не нужно загружать его.

Ответ 9

В приложении Windows.NET(с использованием С# или любого другого) дает вам более прямой доступ к последним и самым большим функциям Windows. Он также очень хорошо поддерживается Microsoft, имеет огромное сообщество и множество книг, написанных об этом.

REALbasic (теперь Xojo) для кросс-платформенных приложений. Использование его как раз в Windows иногда может быть полезно, но это не будет его силой (а это то, что он удивительно прост в использовании).

Я не знаю много о Delphi.

Ответ 10

Из того, что я вижу, у RealBASIC не так много (на самом деле) на пути инструментов Object Relational и, вероятно, не будет столь же хорошим выбором для n-уровневых приложений, ориентированных на базу данных.