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

Имеет ли С# слишком много языковых функций?

Это дискуссия, которая время от времени появляется в нашей команде. В то время как несколько быстро выучили функции С# 3.0, другие придерживаются классических методов.

Некоторые никогда не используют Linq, считают, что лямбда-выражения запутывают, а доход - "страшный". Иногда они едва ли могут понять код, написанный людьми, использующими все новые функции. Мы можем просто сказать, что они не владеют языком и должны его изучить.

Но как тяжело учиться на современном языке программирования?. Каждый может решить проблемы, у каждого есть много других проблем для решения каждый день, чем заботиться о более удобных способах его реализации. Обучение людей не бесплатно. С другой стороны, особенности языка могут сделать людей более продуктивными и более удобными для обслуживания.

Вероятно, неполный список функций С#

  • классы, структуры, примитивные типы, массивы, бокс, интерфейсы, наследование (абстрактные, виртуальные, новые, запечатанные), свойства, nullables
  • исключения
  • дженериков
  • многопоточность, блокировки
  • отражение
  • делегаты, события, анонимные делегаты
  • итераторы
  • лямбда-выражения
  • методы расширения
  • LINQ

Версия 4 скоро появится, включая множество дополнительных функций.

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

Мне интересно ваше мнение и ваш опыт обучения или обучения С#. Есть ли слишком много функций? По-прежнему остаются важные функции? Являются ли языковые функции более легким в использовании или сложнее изучать язык?

Пожалуйста: нет ответов типа "Язык А лучше, чем язык Б, потому что...".

4b9b3361

Ответ 1

Да, это риск - и это обсуждается много. Он доходит до точки, где очень сложно подобрать С# с нуля. К счастью, ситуация немного стабилизировалась, и языковые изменения между С# 3.0 и С# 4.0 относительно незначительны.

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

Например, анонимные методы добавляют много преимуществ для относительно небольшой сложности. dynamic (4.0) добавляет еще несколько сценариев взаимодействия COM. Блоки Iterator неоценимы для кода стиля LINQ...

Я вижу много вопросов о нетривиальных частях С#, и я думаю, что мне было бы трудно научить новичка всему С# с нуля. Такие книги, как Jon С# in Depth, хороши для людей, которые уже знают основы (по крайней мере, С# 1.2, в идеале некоторые С# 2.0), но они не предназначены для новичков (я знаю, что Джон не будет не согласен).

На самом деле сложно. К счастью, команда С# установила панель (для включения) очень высоко; что-то новое должно быть очень полезно для внесения в язык.

Ответ 2

На мой взгляд, у С# не слишком много функций. Почти любая из причудливых новых функций от 2.0 и 3.0 - это ежедневное использование для меня и моих коллег, и даже парень из VB быстро собрал их все. Некоторые из новых функций облегчают изучение языка, например, использование встроенных lambdas вместо делегатов и ключевое слово var и инициализаторы объектов, просто для того, чтобы назвать несколько из С# 3.0 (нет С# 3.5, кстати, вы запутываете что с .NET 3.5).

В большинстве случаев С# был прост в использовании, а мощные функции просты в использовании, в отличие от С++, где дизайнеры говорят, что вы можете делать абсолютно все с С++, но они никогда не упоминают, что многие вещи, как правило, становятся настоящей болью, что происходит потому, что С++ может делать действительно все, включая многие вещи, которые большинство программистов будут редко использовать, если когда-либо. Поддержка всего означает, что многие вещи сложнее, чем необходимо, что усложняет изучение. То, что разница между языком, где функции затрудняют его изучение, но очень мощный и язык, на котором функции облегчают использование и повышение производительности, хотя и менее теоретичны.

И, в чистом количестве функций, С# находится далеко от С++, особенно если вы включили С++ 0x на этом рисунке, что упростило его, несмотря на то, что для некоторых людей было слишком много функций. Моя точка с С++ была скорее тем, что С# на самом деле не имеет так много функций, если вы хотите.

Ответ 3

Когда я программирую на С#, я использую практически все его функции. Не все сразу, заметьте, но каждая особенность С# имеет свое место. Многие люди не знают, что С# имеет оператор "::" и никогда не слышал о " extern alias", но мне пришлось использовать его сегодня для разрешения конфликта имен между двумя DLL.

"Возврат дохода" - одна из моих любимых функций. Я не использую его каждый день, но я использовал для написания интерфейсов IEnumerator вручную в С# 1.0, и это была огромная боль, которую я бы скорее не повторил. Кроме того, это действительно полезно для записи coroutines, даже сопрограммы, которые не производят никакого вывода (yield return null= приостановить операцию).

С# имеет внутренние функции и замыкания. Когда я код на С++, они сильно упущены.

Похоже, что С# имеет так много разных способов записи внутренней функции,

  • delegate(int x) { return x*x; }
  • x => x*x
  • (int x) => { return x*x; }

Но №1 только по историческим причинам, а формы 2 и 3 имеют свое место.

Являются ли это методы расширения, перегрузка операторов, генерические средства, общие ограничения, параметры по умолчанию, объединение нуля, тернарный оператор, статические конструкторы, проверенные/непроверенные, автоматические свойства, директивы препроцессора, типы значений... как программист на полный рабочий день Я использую все это, по крайней мере, иногда, и устранение любой из этих функций либо создает дополнительную работу и обострение для меня (foo(x) ?? bar(y) теперь нужно записать { var temp = foo(x); if (temp == null) temp = bar(y) }), либо требует, чтобы я писал более толстый/медленный код (например, если вы заменяете типы значений на классы, некоторые из моего кода замедлятся, а использование памяти резко возрастет).

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

Трюк позволяет программистам, которые не работают полный рабочий день, чтобы понять. (как для тех людей, которые программируют на С# полный рабочий день и до сих пор не могут выучить язык - um, уволить их?) Возможно, это помогло, если бы Microsoft сделала функции более "Googlable" или, по крайней мере, "F1-able". Например, когда я накладываю курсор на "??" или "= > " и нажмите F1, я должен получить справочную страницу для этих операторов. Или рассмотрим статические конструкторы: если в коде сказано "static constructor()" вместо "static MyClassName()", тогда было бы проще искать его в Интернете.

ИМО, большая проблема, чем раздувание языка, - это раздувание каркаса. Рамка .NET является гигантской, и Microsoft повторно повторяет одни и те же вещи, делая раздутые, ошибочные проекты каждый раз: WinForms и WPF, различные способы доступа к базе данных и т.д.

Ответ 4

Вам, вероятно, следует прочитать этот пост в блоге Эрика Гуннерсона, члена команды компилятора С# в Microsoft.

Он объясняет, как в нем появляются новые функции. В основном они получают "-100 пунктов" в начале, "что означает, что он должен иметь значительный положительный эффект на общий пакет, чтобы он мог превратить его в язык".

Ответ 5

На самом деле существует много дискуссий о том, как должен развиваться С#. Действительно, некоторые считают, что, добавляя множество новых функций, язык становится трудным для изучения, но большинство рассматривает С# как язык программирования с несколькими парадигмами. Это прежде всего строго типизированный полнофункциональный объектно-ориентированный язык, но в нем есть концепции, которые до недавнего времени были ограничены функциональными и динамическими языками программирования. Эти функции, хотя они могут показаться запутанными для новичков, обладают большой гибкостью и мощью, и иногда они могут оказаться достаточно, чтобы вы не использовали язык конкретного домена в приложении и не имели дело со всеми проблемами интеграции. Вы всегда можете говорить о том, что должно быть реализовано в самом языке и что должно быть частью структуры, но имейте в виду, что большинство функций, которые вы упоминаете и считаете излишними, на самом деле являются результатом запросов разработчиков, и они делают обеспечивают функциональность, которая устанавливает С# отдельно от других языков (Java приходит на ум). Как только программист будет использовать эти функции, он придет к осознанию своих преимуществ.

Вы упомянули Linq, и я должен признать, что сначала был немного скептически настроен, так как я всегда считал SQL вполне естественным языком для работы с данными, но теперь мне действительно нравится, и я вижу преимущество наличия запросов, оцененных во время компиляции. Лямбда-выражения всегда хороши, действительно, они могут сделать код трудным для чтения, если его использовать чрезмерно, но иногда они фактически упрощают его. Я не большой поклонник ключевого слова "var", но иногда это пригодится и, честно говоря, не использую его, когда писать Linq сделает код трудным для чтения. Я сам начинающий программист, и я не думаю, что это трудно понять. Я также много использую Java в школе, и я действительно пропускаю некоторые функции С# (я не говорю, что Java - плохой язык, наоборот, в некоторых отношениях я думаю, что это лучше, чем С# -код контрактов, особенно для академические цели).

Ответ 6

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

Иногда они едва ли могут понять код, написанный людьми, использующими все новые функции.

Это настоящая проблема, с которой вам нужно обратиться. База кода, разбитая на разные стили и не поддерживаемая всеми, является дорогостоящей базой кода для поддержки. Использование новых функций для написания "короткого и приятного кода" не может максимизировать полезность этого кода для вашей организации.

Какова основная причина вашей ситуации? Это:

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

Я бы поставил деньги, это будет смесь вышеупомянутого.

Ответ 7

Должно ли быть трудно выучить современный язык программирования?

Для: вы идеально хотите использовать самый мощный язык, который вы можете, что позволяет правильно выражать вещи.

Против: вы хотите думать о проблеме, а не о том, как работает язык.

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

Отредактированная дополнительная мысль: я пытаюсь поддерживать последовательный/логический синтаксис при добавлении функций на язык, но это не правильный поток для обсуждения lisp.

Есть ли функции, от которых С# должен избавиться?

Я много использую новые функции, такие как LINQ, методы расширения, var (я только что написал тип, почему я пишу его снова?) и анонимные функции. Я обнаружил, что они могут принести очень большие преимущества в производительности. Я бы порекомендовал всем, кто еще не справился с LINQ, но им потребуется некоторое время, чтобы изучить Linq-to-Objects, потому что это чрезвычайно удобно в любое время, когда вы устанавливаете логику для решения.

Мне особенно не нравится специальный синтаксис LINQ, подобный SQL. Я нахожу это немного раздражающим в середине кода С# - на мой взгляд, он сталкивается с методом объекта, вызывающим стиль синтаксиса. я бы более счастливым с более распространенным синтаксисом понимания списка, например, используемым, например, Python.

Есть ли новые функции, которые нужны С#?

Мне бы очень хотелось получить более синтаксис для быстрой инициализации массивов (или, может быть, IEnumerables?) и словарей. С# немного громоздка в этом отношении - мне приходится печатать так много брекетов. В связи с этим я действительно скучаю по урожаю! (выход каждого элемента в этой коллекции).

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

Ответ 8

Хотя я всего лишь случайный пользователь С#; с сильным фоном в Delphi, С++ и Python; Я легко понимаю концепцию функций С#. На мой взгляд, С# - правильно сбалансированный язык. Единственное досаду заключается в том, что я едва мог вспомнить достаточный синтаксис (особенно связанный с Linq) в моей голове, чтобы создать скорость ввода текста, как я могу в Python. Мое предпочтение по отношению к синтаксису паскаля также могло мешать мне. Однако, с помощью всемогущего Visual Studio.NET Express, это не проблема.

Пока они предоставляют такой потрясающий инструмент бесплатно, я считаю, что С# с VS.NET является одной из лучших доступных сред кодирования.

Ответ 9

Мне тоже нравится большинство новых функций и, честно говоря, не захочет терять методы расширения и linq в целом.

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

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

Ответ 10

Да С# имеет множество функций, но почему мы его используем! Любой, кто вступает в карьере программиста, должен рассчитывать провести там карьеры, изучать и изучать новые вещи и сдавать экзамены! Как человек, который любит изучать новые вещи, вот почему мы его любим!

Лично я нахожу, лямбда-выражения и методы расширения, например, чрезвычайно полезны. Для создания распределенных приложений большего масштаба, где я хочу разделять данные и логику, я нашел, что LINQ не будет настолько полезен. Но я с нетерпением жду возможности С# 4, таких как необязательные параметры.

Как упоминалось в @Alex, я думаю, что изучение того, когда использовать функции, является самым сложным аспектом. Horrah для тех из нас, кто был с С# с первых дней!

Ответ 11

Я думаю, что проблема кроется с людьми, которые просто должны использовать новейший синтаксис для всего, везде. Они создают простую программу "Hello World", которая будет выглядеть как взрыв в спагетти factory.

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

Не многие люди будут читать ваши книги.

Тот факт, что язык позволяет некоторым людям делать такой беспорядок, затягивает других людей, потому что они должны выяснить, что происходит. Мой опыт в том, что люди, которые пишут такой код, не пишут код, который работает очень хорошо и нуждается в большом количестве обслуживания. Я имею в виду, что они уже бросили принцип KISS в корзину. ИМХО искусство или программирование делают сложные вещи просто не наоборот. Такая ситуация может создать рынок для более простого языка, который сделает все, что вам нужно, но только в читаемом человеческом синтаксисе.

Ответ 12

Возможности - это причина, по которой мы используем С# и что делает С# "современным". Если бы С# не предлагал классы, например, или многопоточность, если бы кто-нибудь это использовал? Сборка - это пример языка, который на самом деле не имеет никаких функций. Это глупо легко учиться как язык, но никто не хочет его использовать.

Маленькие доменные языки на самом деле являются экстремальными. Возьмем классическое регулярное выражение, например. Он получил HEAP-функции только для строковых манипуляций. Если бы у них их не было, кто бы это использовал? Эти особенности делают его настолько мощным и выразительным. То же самое с более общими языками.

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

Ответ 13

Да, у С# есть много функций, и это не мое мнение, это факт, это богатая платформа. Если кто-то хочет спорить об этом и утверждать, что на этом языке не так много функций, пожалуйста, покажите мне язык, на котором есть много возможностей, и объясните, почему у него гораздо больше функций, чем на С#.

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