TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1315 1.44K
День 1067.
Оглядываясь Назад на C#. Продолжение
С новым годом! Продолжаем вчерашнюю историю…

Наряду с этим у языка C# были «особенности», которые и в то время считались пугающими, а сегодня вообще бы сделали язык непригодным для использования:
1. В C# были только массивы (никаких других коллекций), и во многих случаях их нельзя было расширять. В то время в .NET Framework были вспомогательные функции для этого, но это было совсем не так просто, как, например, вызов List<T>.Add(). Встроенные функции копировали данные в новый массив, поэтому, если вы рассчитывали, что ссылки на исходный массив все ещё работают, вам не повезло. Вы также должны были осознавать компромиссы между временем и количеством памяти и выбирать оптимальный подход. В .NET был список ArrayList, который изначально поддерживал расширение, но только в том случае, если вы соглашались с тем, что все его элементы были типа Object.

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

3. Обнуляемые значимые типы (например, целые числа) не существовали. Это ставило разработчиков перед трудной проблемой определения того, как обрабатывать значения по умолчанию. Вы предполагали, что 0 - значение по умолчанию для целых чисел. Это работало, только если 0 не находился в диапазоне допустимых значений. Тогда приходилось выбирать другое значение, например -1. И это работало, пока кто-то не забывал установить это значение по умолчанию, и вы не тратили часы на поиск того, откуда появляется 0.

4. Хотя технически это не совсем проблема C#, концепция файла .ini была заменена конфигурацией в виде XML, который разработчики до этого никогда не видели и не понимали, как использовать. Хотя сейчас это звучит довольно глупо, простая конфигурация в виде «ключ=значение» была заменена гораздо более многословным синтаксисом.

С другой стороны, в Microsoft предприняли несколько смелых шагов, невиданных в языках в то время, чтобы помочь программистам в их повседневной работе. Хотя C#, возможно, и не изобрёл с нуля эти концепции, он пропагандировал их, просто мягко побуждая разработчиков работать более продуктивно и устраняя распространённые ошибки, что и сделало его популярным.

Один из примеров – запрет «проваливаться» в следующий case:
switch number
{
case 0:
DoSomething();
// Нельзя опускать оператор break
case 1:
DoSomethingElse();
break;
...
}
Хотя некоторым это ограничение кажется смешным, оно экономит бесчисленные часы отладки, когда break был случайно пропущен.

Точно так же C# убрал необходимость в «синтаксисе Йоды» if (42 == answer), когда константа ставится в левую часть оператора сравнения, просто чтобы не путать сравнение с присваиванием if (answer = 42).
Также запрещены выражения вроде if(42), а требуется явное if(42 > 0), потому что первое сбивает с толку людей, не понимающих, почему, например, в JavaScript if(-1) оценивается как true.

Окончание следует…

Источник:
https://kemiller2002.github.io/c-sharp/2021/12/24/reflection.html
  • 👍 4
  • 👎 2
More from @netdeveloperdiary
  1. Oct 15, 2026Post #3374
  2. Oct 14, 2026Post #3373
  3. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  4. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  5. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →