Отношение между c# (csharp) и net


Содержание

Углубление в C#
Страница 6. Пространства имен в C# и Java

Осборн: Кажется, существуют различия между тем, как нам следует смотреть на пространства имен в C# и Java. Концептуально это одно и тоже? Или они реализованы по разному?

Хейлсберг: Концептуально да, но их реализации вовсе не похожи. В Java имена пакетов имеют также и физический смысл, который указывает на структуру директорий ваших исходных файлов. В C# мы имеем полное разделение между физическим расположением и логическим именованием, так, если вы вызовете ваше пространство имен, то ничего не произойдет в реальном физическом хранилище вашего кода. Это дает вам свободу располагать модули вместе в физических пакетах, не принуждая вас иметь соответствие в директориях. В самом языке, конечно, тоже существуют отличия. Так как в Java пакеты имеют также и физическую структуру, исходный файл должен располагаться в верной директории и иметь только один public класс или public тип. В виду того, что в C# нет такой связи физического и логического расположения, вы можете именовать свои исходные файлы как захотите. В каждом файле может содержаться несколько пространств имен и несколько public классов. Таким образом вы можете записать весь ваш исходный код в один файл или расположить его в нескольких маленьких. Концептуально во время компиляции происходит следующее — вы передаете все исходные файлы вашего проекта компилятору, а он уже решает что с ними делать.

Осборн: У меня есть вопрос о настраиваемом программировании: Вы считаете, что это важная концепция и она должна быть частью объектно ориентированного языка. Если это так, то каковы ваши планы реализацию настраимового программирования, как части C#.

Гудхью: Кое-что из того, что мы собирались включить в первый релиз, было создано — вопреки тому, что все думают о Microsoft — у нас нет неограниченных ресурсов. Мы приняли несколько трудных решений о том, что действительно будет в первом релизе.

Хейлсберг: В отношении настроек, о которых вы спрашивали — Я определенно думаю, что это очень полезная концепция. Нужно отметить что все исследования настроек происходили в академии и индустрии. Шаблоны — решение для этой проблемы. Во время наших внутренних обсуждений мы решили, что хотели бы включить это в нашу новую платформу. Чего мы действительно хотим — чтобы среда выполнения понимала настройки. Это отличается от того, как некоторые прототипы настроек были построены. Возьмите понятие стирания (erasure) в Java, в действительности у системы нет никаких представлений о настройках. Имея понимание концепции настроек, как в CLR, множество языков могут добиться большей функциональности. Вы можете писать на C# настраиваемый класс, а другой человек в другом месте будет работать с ним, используя другой язык.

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

Добавив понятие настроек в общую среду выполнения, она стала понимать, что когда приложение или компонент запрашивают у нее список всех «Foo», оно задает себе вопрос «Имею ли я на данный момент реализацию (код, создающийся при вызове настраиваемой функции, в зависимости от параметров) списка Foo?». Если это так, использует его. Так, если Foo тип, передаваемый по ссылке, то реализация может быть одна для всех ссылочных типов. Если же тип, передаваемый по значению (вроде int или float) — то для каждого типа будет своя реализация. Но только тогда, когда приложение запрашивает ее. Мы проделали всю основную работу, необходимую для добавления распознавания настроек в среду выполнения.

Интересна связь между IL и распознаванием настроек. Если инструкции в IL содержат информацию о типах, например, если сложение это не сложение, а сложение int, сложение float или сложение double — у вас нет возможности настроек в таком случае. Наш формат IL вправду нейтрален к типам. И по причине нейтральности к типам, мы можем добавить возможность настроек позже, без каких-либо для нас проблем. Это одна из причин, почему наш IL выглядит иначе, нежели Java байткод. Он у нас нейтрален к типам. И инструкция сложение — это сложение двух элементов, находящихся вверху стэка. Это может быть преобразовано в иной код, когда настройки будут реализовываться.

Осборн: Это доступно во всех языках платформы .NET?

Хейлсберг: Да. Исследовательский центр Microsoft Research в Кэмбридже создала версии общей среды выполнения и компилятора C#, допускающие настройки. Мы ищем путь внедрения этого. Похоже что этого не произойдет в первом релизе. Но мы сейчас работаем над тем, чтоб убедиться, что не делаем каких-либо вещей в первом релизе, которые не восприняли бы картины настроек.

Осборн: Когда вы планируете выпустить C#, платформу .NET и следующую версию Visual Studio?

Гудхью: Мы уже раздали здесь обзорную версию технологии 6500 посетителям конференции. Мы собираемся некоторое время (2000 год) использовать beta версию, а далее, когда все будет готово, сделаем релиз. Одна из вещей, которую мы действительно проделали — это подробный анализ, того, как прошел релиз Windows 2000, и путей вовлечения некоторых клиентов в процесс разработки и распространения. В случае платформы .NET и Visual Studio, мы будем вновь работать с клиентами, чтобы понять, когда все это действительно будет готово к релизу. Пусть они скажут нам, когда продукт готов. И по причине того, что в процесс вовлечены реальные клиенты, продукт обещает быть качественным. Другой стороной этого процесса является приобретение некой неопределенности. Мы ориентируемся на качество продукта, а не просто выбираем дату выпуска.

Осборн: Таким образом дату, когда будет написан весь код, вы заменяете датой, когда продукт будет готов работать?

Гудхью: Да это так. Я думаю, что разработчики узнают релиз Visual Studio .NET, как один из наиболее качественных релизов за всю историю Microsoft.

10 фич в C#, о которых вы определённо должны узнать и начать их использовать

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

1. async / await

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

2. Инициализаторы объектов / массивов / коллекций

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

3. Лямбды, предикаты, делегаты и замыкания

Эти фичи просто незаменимы во многих случаях: например, при использовании LINQ. Поэтому рекомендуем вам убедиться, что вы действительно понимаете, когда и как их использовать.

4. ?? (Оператор объединения с NULL)

x ?? y — возвращает x , если значение отличается от null ; в противном случае возвращает y .

Может быть несколько операторов .

?? также может быть использован для перевода типов null в не null :

5. $”” (Интерполяция строк) — C# 6

Фича в C# 6 позволяет эффективно и элегантно собирать строки:

6. ?.(определяет null) — C# 6

x?.y — доступ к членам, определяемый условием null . Возвращает значение null , если левый операнд имеет значение null .

Больше никаких NullReferenceExceptions!

7. Выражение nameof — C# 6

Может показаться, что выражение nameof не особо полезно, но это не так. При использовании автоматических инструментов рефакторинга (например, ReSharper) иногда может потребоваться обратиться к аргументу метода по его имени:

Вот, как это должно быть:

8. Инициализаторы свойств (property) — C# 6

Инициализаторы свойств позволяют задавать начальные значения для свойств:

Польза их использования заключается в том, что вы не можете объявить setter, тем самым делая свойства неизменяемыми. Инициализаторы свойств хорошо работают в связке с синтаксисом первичного конструктора в C# 6.

9. Операторы as и is

Is — совместимость типов. Возвращает значение true, если вычисленный левый операнд может быть приведен к типу, указанному в правом операнде (статический тип).

As — преобразование типов. Возвращает левый операнд, приведенный к типу, заданному правым операндом (статический тип), но as возвращает null , где (T)x вызывает исключение.

10. Ключевое слово yield

Ключевое слово yield позволяет заполнить интерфейс IEnumerable объектами (items). Следующий пример вернет все степени двойки от 2 до 2 в степени 8 (то есть 2, 4, 8, 16, 32, 128, 256):

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

Условные операторы и конструкции языка C# (sharp)

Условные операторы позволяют строить логические условия. «Если это так, то сделать то-то, иначе поступать вот так» и тому подобные примеры. Любое условие типа «так или иначе» можно оформить в виде кода.

Именно благодаря условным операторам можно строить разветвляющиеся алгоритмы, элементы логики и заставлять «думать» Ваш компьютер.

Существует три вида условий на языке C#:

  1. if() — если, основное условие, если используется, то только один раз;
  2. else if() — альтернативное условие, если не сработало основное условие, использоваться может сколько угодно раз;
  3. else — срабатывает, если не было выполнено ни одно из условий, использоваться может только один раз;

В круглых скобках указывается логическое выражение.
Если логическое выражение верно (например, 2 меньше 10), то оператор возвращает true (истина или правда), а это значит, что логическое выражение выполнилось и код в этом блоке нужно выполнить.
Если логическое выражение не верно (например, 2 больше 10), то оператор возвращает false (ложь или неправда), а это значит, что логическое выражение не выполнилось и код в этом блоке выполнять не нужно.

Возвращать значение — это значит, что произошло какое-то действие и оператор (или функция) «ответил» нам. Мы задали вопрос (что больше, то или то) и компилятор дал нам ответ (либо да — true, либо нет — false).

Для того, чтобы что-то с чем-то сравнивать необходимо использовать специальные символы отведённые под это дело. Такие символы называются логическими операторами отношений.

Логические операторы отношений

На самом деле этих операторов не так уж и много.

  1. > — больше;
  2. = — больше, либо равно;
  3. Модель условных конструкций на C#

What is the difference between C# and .NET?

May I know what is the difference between C# and .NET? When I think of C#, right away I would say it is a .NET language, but when I search for job posts, they require candidates to have C# and .NET experience. Can someone give me an explanation?

10 Answers 10

In addition to what Andrew said, it is worth noting that:

  • .NET isn’t just a library, but also a runtime for executing applications.
  • The knowledge of C# implies some knowledge of .NET (because the C# object model corresponds to the .NET object model and you can do something interesting in C# just by using .NET libraries). The opposite isn’t necessarily true as you can use other languages to write .NET applications.

The distinction between a language, a runtime, and a library is more strict in .NET/C# than for example in C++, where the language specification also includes some basic library functions. The C# specification says only a very little about the environment (basically, that it should contain some types such as int , but that’s more or less all).

C# is a programming language, .NET is a blanket term that tends to cover both the .NET Framework (an application framework library) and the Common Language Runtime which is the runtime in which .NET assemblies are run.

Microsoft’s implementation of C# is heavily integrated with the .NET Framework so it is understandable that the two concepts would be confused. However it is important to understand that they are two very different things.

Here is a class written in C#:

Here is a class written in C# that explicitly uses a .NET framework assembly, type, and method:

As I mentioned before, it is very difficult to use Microsoft’s implementation of C# without using the .NET framework as well. My first Example implementation above even uses the .NET framework (implicitly, yes, but it does use it nonetheless) because Example inherits from System.Object .

Also, the reason I use the phrase Microsoft’s implementation of C# is because there are other implementations of C# available.

C# is a programming language, .NET is the framework that the language is built on.

C# is a strong Object Oriented programming language that is mostly built on the .NET framework.

C# is the airplane and .NET is the runway ;)

C# is a language, .NET is an application framework. The .NET libraries can run on the CLR and thus any language which can run on the CLR can also use the .NET libraries.

If you are familiar with Java, this is similar. Java is a language built on top of the JVM. though any of the pre-assembled Java libraries can be used by another language built on top of the JVM.

In .NET you don’t find only C#. You can find Visual Basic for example. If a job requires .NET knowledge, probably it need a programmer who knows the entire set of languages provided by the .NET framework.

When people talk about the «.net framework» they tend to be combining two main areas — the runtime library and the virtual machine that actually runs the .net code.

When you create a class library in Visual Studio in C#, the DLL follows a prescribed format — very roughly, there is section that contains meta data that describes what classes are included in it and what functions they have, etc.. and that describes where in the binary those objects exist. This common .net format is what allows libraries to be shared between .net languages (C#, VB.Net, F# and others) easily. Although much of the .net «runtime library» is written in C# now (I believe), you can imagine how many of them could have been written in unmanaged languages but arranged in this prescribed format so that they could be consumed by .net languages.

The real «meat» of the library that you build consists of CIL («Common Intermediate Language») which is a bit like the assembly language of .net — again, this language is the common output of all .net languages, which is what makes .net libraries consumable by any .net language.

Using the tool «ildasm.exe», which is freely available in Microsoft SDKs (and might already be on your computer), you can see how C# code is converted into meta data and IL. I’ve included a sample at the bottom of this answer as an example.

When you run execute .net code, what is commonly happening is the .net virtual machine is reading that IL and processing it. This is the other side of .net and, again, you can likely imagine that this could easily be written in an unmanaged language — it «only» needs to read VM instructions and run them (and integrate with the garbage collector, which also need not be .net code).

What I’ve described is (again, roughly) what happens when you build an executable in Visual Studio (for more information, I highly recommend the book «CLR via C# by Jeffrey Richter» — it’s very detailed and excellently written).

However, there are times that you might write C# that will not be executed within a .net environment — for example, Bridge.NET «compiles» C# code into JavaScript which is then run in the browser (the team that produce it have gone to the effort of writing versions of the .net runtime library that are written in JavaScript and so the power and flexibility of the .net library is available to the generated JavaScript). This is a perfect example of the separation between C# and .net — it’s possible to write C# for different «targets»; you might target the .net runtime environment (when you build an executable) or you might target the browser environment (when you use Bridge.NET).

A (very) simple example class:

Введение в C# (C Sharp): программирование простым языком

Начинаем писать статьи направленные на формирование представления о простейших составляющих написания кода для людей. Сегодня материал для тех, кто только начавших изучение языка C# Sharp (Си Шарп). Всяк ступивший на стезю сотворения алгоритма да не убоится неизвестности, бардака и самозабвения.

О языке программирования C#

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

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

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

С# (С Sharp, Си Шарп) – объектно-ориентированный язык программирования. Что это означает? Объект – участок кода, содержащий в себе данные и инструкции по их обработке.

Пример

Объект «попугай» содержит в себе данные о сытости и настроении, действия «есть», «подражать голосу хозяина» и «кусаться». Будет птица дразниться или кусаться зависит от текущего настроя: если питомец весел, то он скорее будет играть, чем травмировать своего кормильца.

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

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

Алгоритмы и компиляторы

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

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

Прежде всего, компиляторы (программы, в которой пишутся программы) очень чувствительны к регистру. Все операторы, переменные и команды нужно запоминать и писать в точности так, как они написаны в справочниках. То есть, переменная a и переменная A – совершенно разные переменные, а если будет написана строчка console.writeline(“”); вместо Console.WriteLine(“”); то будет выведена ошибка и, если повезет, правильно указано ее местоположение.

Пунктуация

Следующий «подводный камень» — пунктуация. Ситуация сравнима с диктантом по русскому языку у придирчивого преподавателя. Пропустите знак хоть в одном месте – программа откажется работать.

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

Для начала разберемся с основными значками:

  • Знак «;»
  • Знаки «//» и пара «/*» и «*/»
  • Знаки «< >»
  • Знаки «» «»

Знак «;» прописывается в конце строки. Он обозначает для компьютера конец команды и разрешение приступить к следующей. Его смысл аналогичен точке в конце предложения: «Я есть Грут; Грут самый лучший юморист; Правда ли он симпатяга;».

Да, с эмоциями здесь натянуто. Впрочем, можно высказаться внутри знаков «//» и «/* */». Первый используется для заметок размером в одну строку, второй нужен для более распространенного текста. Они говорят компьютеру, что содержимое внутри пространства, обрамленного такими значками, не имеет к нему никакого отношения. Программист заключает в них комментарии, помогающие при отладке кода. «< >» нужны для обозначения границ конкретно взятого объекта.

Грубо говоря, их можно сравнить с обложкой тетради. Их функция – заключения внутри себя участка кода. Они являются привычным атрибутом многострочного программного текста, заключенного внутри команды. А парочка «” “» используется внутри текстовых операторов для помещения непосредственно текста для выведения на экран.

Начало программы

Каждая программа начинается со строк using. Это библиотека. Если перевести на понятный язык, using присоединяет к программе особую библиотеку, в которой хранятся команды с описанием выполняемых действий по запросу.

Так, Console.WriteLine хранится в библиотеке System.Text, в которой сказано, что программа должна вывести на экран текст внутри кавычек. Минимальный набор выглядит таким образом:

Следующая немаловажная деталь – Main(). В переводе с английского «главный», что прямо намекает на его назначение. Исполнение алгоритма начинается с кода, заключенного внутри Main().

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

Это включение предполагает, что программа, исполнив свою инструкцию, удалит все данные. Напоминает вывеску в столовой: «Поел – убрал за собой». Напоследок можно разобрать две простейшие команды: Console.WriteLine и Console.ReadLine.

Console.WriteLine(“”); призвана вывести на экран текст, заключенный внутри кавычек. Пример с этим оператором разобран в скриншоте выше, поэтому сразу перехожу к другой команде.

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

Заключение

Подытожим. Теперь нам известны основные правила синтаксиса, а также мы получили образное представление о базовых элементах кода. Неплохо для одного дня. Для тех кто программирует Ардуино нужно понимать, что этот микроконтроллер программируется языком C++. Но мы все знаем, что изучив даже один язык программирования довольно легко выучить и другие. Всем хорошего настроения. Дорогу осилит идущий.

Преимущества и недостатки C# — Учим Шарп #1

Опубликовано shwan в 06.11.2020

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

Что бы тебе ни рассказывали на всевозможных онлайн курсах, книгах, тренингах и конференциях, о том, как можно стать программистом за 21 день – все это ложь, п*дежь и провокация.

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

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

История языка C#

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

Данный язык создан всеми так горячо любимой корпорацией Зла Microsoft в 2000 году. Он очень многое унаследовал от своих родителей (С++ и Java), но и привнес нового.

Возможной версией использования символа хештега принято считать наследование плюсиков от предков, примерно следующим образом: C → C++ → C++++(C#), потому что символ «#» при хорошем воображении можно получить путем объединения 4-х знаков «+».

Язык активно развивается. Регулярно выходят новые версии C#, которые добавляют новые синтаксические конструкции в язык, а также увеличивают его быстродействие и надежность.

Преимущества C#

Данный язык использует объектно-ориентированный подход к программированию во всем. Это означает, что тебе нужно будет описывать абстрактные конструкции на основе предметной области, а потом реализовывать между ними взаимодействие. Данный подход пользуется большой популярностью, потому что позволяет не держать в голове всю информацию, а работать по принципу черного ящика: подал входные данные -> МАГИЯ -> PROFIT.

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

Еще стоит упомянуть, что все это работает на базе платформы .NET Framework. Что это означает? Для многих непосвященных, это просто какая-то приблуда, которую нужно установить на комп, чтобы программа запустилась, но дело обстоит значительно глубже. Написанный тобой код на языке C# транслируется в промежуточный язык (IL), который в свою очередь уже преобразуется в машинный код на твоем компьютере прямо во время выполнения приложения (JIT). Спрашивается, зачем это все? А суть в том, что ты можешь пилить со своим другом Васей на разных языках один и тот же проект и ни одному из вас не придется переучиваться. Но я никогда не видел, чтобы это реально использовали на практике. Но это еще не все. Так как окончательная компиляция из промежуточного кода выполняется в живую на твоей конкретной машине, то возможно увеличение производительности за счет использования специфических команд именно твоего процессора.

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

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

Немаловажно наличие хороших инструментов разработки, и здесь все очень хорошо. Абсолютное большинство разработчиков используют интегрированную среду разработки Visual Studio, которая предоставляет over9000 возможностей, использовать которые ты конечно же не будешь.

Но IDE действительно хороша, к тому же имеется ее полнофункциональная бесплатная версия Community.

Еще к плюсам можно отнести строгую типизацию, которая позволяет защититься от дурака, и не так давно появившаяся кросспратформенность в .NET Core (да-да, мелкомягкие потихоньку захватывают линукс).

Недостатки C#

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

C# очень легко дизассемблируется. Это означает, что с большой долей вероятности твой код будет получен и изучен конкурентами. Конечно же, есть специальные инструменты, которые могут усложнить этот процесс, но на 100% защититься от этого практически невозможно.


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

C# не является повсеместно распространенным языком. Большинство программистов сосредоточены в коммерческой Enterprise сфере, что накладывает весьма серьезные ограничения на поиск работы в небольших городах, где кроме Delphi или PHP ничего жизни не видели. К тому же, как бы то ни было, C# в первую очередь ассоциируется с Windows. Вряд ли в обозримом будущем что-то изменится и Винда все также будет продолжать доминировать на рынке, но все же небольшой риск остается, особенно учитывая недавние фейлы с обновлениями в Windows 10.

Перспективы развития C#

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

Компания Microsoft остается одной из крупнейших IT компаний мира, а C# ее флагманский язык программирования, который постоянно развивается и впитывает в себя все новые возможности. Поэтому в обозримом будущем проблем у данного языка возникнуть не должно.

Сферы применения языка C#

В этой области C#, наверное, впереди планеты всей. Хочешь разрабатывать обычные приложения для компьютера – пожалуйста, стандартные WinForms Application и консоль тебе в помощь. Хочешь такие же, но покрасивее? – используй WPF. И специальные приложения для магазина в Windows Store тоже. Веб-приложения? – Легко ASP.NET всегда придет на помощь. На Linux? – тоже не вопрос, .NET Core уже здесь. Мобильное приложение? – Xamarin сделает сразу под все платформы. Хочешь написать игру? – движок Unity показывает себя очень даже неплохо, и при этом также адаптирует игру под различные платформы. Хочешь приблизить апокалипсис с восстанием машин и создаешь искусственный интеллект? – есть целая платформа с кучей инструментов для этого Microsoft AI Platform. Также и для компьютерного зрения и ботов. Я вообще с трудом могу придумать пример того, что невозможно реализовать на C#. Я где-то встречал даже операционную систему написанную на шарпе. Поэтому в этой области все хорошо.

Зарплаты разработчиков C#

Здесь все в целом неплохо. По данным на 2020 год, C# явно не является самым высокооплачиваемым языком, но и не самый низкооплачиваемый тоже. Среднее значение зарплаты для данного языка в России около 90к рублей. Это весьма неплохой результат, но бесспорно есть и более дорогие языки. В целом, уровень заработной платы намного больше зависит от прямоты рук и уровня знаний, поэтому не так важно на каком языке писать, главное делать это хорошо. Но данная цифра задает примерный уровень для Middle разработчика в среднем по России. От этого уже можно отталкиваться.

Итоги

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

В целом это перспективный язык, достаточно простой для освоения начинающим. Но следует помнить, что существует множество альтернатив, которые лучше подходят под некоторые задачи. Например, могу порекомендовать языки C++, Java, Python.

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

Основная идея C# — это универсальность. Ты можешь реализовать все на одном языке и для любой платформы, но с большой долей вероятности это будет работать медленнее, чем разработанное специально под конкретную платформу.

Он неплохо подходит как для начинающих в качестве первого языка, так и для реализации крупных коммерческих проектов.

На этом мы заканчиваем наш первый урок. Подписывайтесь на мои социальные сети: Вконтакте, Телеграм, YouTube и Дзен. Ну а еще есть специальный закрытый чат, для изучающих C# по моему курсу. С вами был Вадим. Пока!

C# против Java: какой язык программирования общего назначения выбрать?

Что такое C#?

Что такое JAVA?

C# VS. JAVA: ОСНОВНЫЕ СХОДСТВА

  • Безопасность типов. Ошибка типа возникает, когда тип данных одного объекта ошибочно назначается другому объекту, создавая непреднамеренные побочные эффекты. И C#, и Java работают на то, чтобы гарантировать выявление таких типов незаконных приведений во время компиляции. Если приведение не может быть применено к новому типу, тогда во время выполнения такие исключения будут удалены.
  • Сборка мусора: На языках более низкого уровня управление памятью может быть утомительным, ведь нужно помнить о том, что необходимо правильно удалить новые объекты, чтобы освободить ресурсы. На С# и Java есть встроенная сборка мусора, которая помогает предотвратить утечку памяти путем удаления объектов, которые больше не используются приложением. Утечки памяти все еще могут возникать, но благодаря основам управления памятью — это уже не ваша проблема.
  • Одиночное наследование. Оба языка поддерживают одиночное наследование – это означает, что существует только один путь из любого базового класса в любой из его производных классов. Это ограничивает непреднамеренные побочные эффекты, которые могут возникать при наличии нескольких путей между несколькими базовыми классами и производными классами. Diamond pattern – книжный пример этой проблемы.
  • Интерфейсы. Интерфейс представляет собой абстрактный класс, где все методы абстрактны. Абстрактным методом является тот метод, который объявлен, но не содержит подробностей его реализации. Код, определяющий любые методы или свойства, определенные интерфейсом, должен предоставляться классом, который его реализует. Это помогает избежать двусмысленности паттерна diamond, поскольку всегда ясно, какой базовый класс реализует данный производный класс во время выполнения. Результатом является чистая иерархия линейных классов одиночного наследования в сочетании с некоторой универсальностью множественного наследования. Фактически использование абстрактных классов является одним из способов множественного наследования языков, которые могут преодолеть проблему паттерна diamond.

C# VS. JAVA: ОСНОВНЫЕ РАЗЛИЧИЯ

Важно помнить, что C# берет свое начало в желании Microsoft иметь собственный «Java-подобный» язык для платформы .NET. Поскольку C# не создавался в вакууме, новые функции были добавлены и настроены для решения проблем, с которыми сталкивались разработчики Microsoft, когда они изначально пытались создать свою платформу на Visual J++. В то же время сообщество Java с открытым исходным кодом продолжало расти и между этими двумя языками развивалась гонка технических вооружений. Вот некоторые из основных различий между C# и Java.

  • Windows vs open-source. Хотя существуют реализации с открытым исходным кодом, C# в основном используется в разработке для платформ Microsoft – .NET Framework CLR и является наиболее широко используемой реализацией CLI. На другом конце спектра Java имеет огромную экосистему с открытым исходным кодом и у него открылось второе дыхание отчасти благодаря тому, что Google использует JVM для Android.
  • Поддержка обобщений (Generics): Generics улучшает проверку типов с помощью компилятора, в основном удаляя приведения из исходного кода. В Java средства обобщений реализуются с использованием стираний. Параметры общего типа «стираются», а при компиляции в байт-код добавляются приведения. C# также использует обобщения, интегрируя его в CLI и предоставляя информацию о типе во время выполнения, что дает небольшое увеличение производительности.
  • Поддержка делегатов (указателей): В C# есть делегаты, которые по существу служат в качестве методов, которые могут быть вызваны без знания целевого объекта. Для достижения такой же функциональности в Java вам необходимо использовать интерфейс с одним методом или другим способом обхода, который может потребовать нетривиального количества дополнительного кода, в зависимости от приложения.
  • Проверяемые исключения: Java различает два типа исключений – проверяемые и непроверяемые. C# выбрал более минималистский подход, имея только один тип исключения. Хотя способность ловить исключения может быть полезна, она также может отрицательно влиять на масштабируемость и контроль версий.
  • Полиморфизм: C# и Java используют очень разные подходы к полиморфизму. Java допускает полиморфизм по умолчанию, C# же должен вызывать ключевое слово «virtual» в базовом классе и ключевое слово «override» в производном классе.
  • Перечисления (Enums): в C# перечисления представляют собой простые списки именованных констант, где базовый тип должен быть целым. Java представляет перечисления более глубоко, рассматривая его как именованный экземпляр типа, что упрощает добавление пользовательского поведения к отдельным перечислениям.

Когда стоит использовать C# или Java?

Язык, который вы в конечном итоге решите использовать, будет во многом зависеть от платформы, которую вы выбрали для своего проекта. Сегодня C# используется в основном для реализации CLI на .NET Framework, Mono и Portable.NET. Если ваше программное обеспечение или веб-приложение создаются для Windows, C# будет работать лучше всего с набором технологий .NET.

Тем не менее, если вы хотите разрабатывать для Unix, Linux или других платформ за пределами платформы Microsoft, экосистема с открытым исходным кодом – Java – лучший выбор. Сообщество постоянно создает новые библиотеки и инструменты. Появились новые мощные языки, такие как Scala, Clojure и Groovy, и они все тоже основаны на JVM. К тому же это неплохо, что большинство реализаций JVM являются общедоступными и бесплатными. Java – основной язык разработки, который использует Google для Android – самой большой мобильной операционной системы в мире в настоящее время.

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

Итог: выберите язык, который лучше всего подходит для платформы вашего проекта.

Обучение C# (c sharp)

Данный видеокурс представлен для новичков в языке программирования C#. Если Вы решили, что готовы начать обучение программированию, то стартуйте вместе с нами! Курс программирования C# Стартовый поможет Вам начать Ваше знакомство с языком программирования C#. Узнайте основы современного программирования на Visual C # 2012 и приступите к созданию Вашего первого приложения на языке C#.

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

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

На этом видео уроке Вы изучите условные операторы, позволяющие разрабатывать алгоритмы, в которых от выбора пользователя или от других условий будет зависеть результат. В этом уроке будут рассмотрены такие условные конструкции языка программирования C# — if/else, switch, тернарный оператор.

Данный видео урок рассматривает понятия логических и побитовые операции. На видеокурсе объясняется применение и использование операций конъюнкции, дизъюнкции, исключающего «или», логических операторов, операторов сдвига в языке программирования C#.

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

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

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

Главная задача для бoльшинствa приложeний cводится к aнализу дaнных и вычиcлений, производимых нaд бoльшими объeмами дaнных. Для тoго, чтoбы в Вaших прилoжениях пoявилась возможноcть хрaнить многo однoтипных знaчений, Вaм нужно cоздавать маcсив. Видeо урок обучит Вaс нe тoлько кaк сoздать мaссивы, но и произвoдить oсновные опeрации нaд ними. Вы узнаeте, какиe нужно использовaть циклы при рaботе с мaссивами и изучите такие типы массивов как одномерные, многомерные, зубчатые.

Практикум курса C# Стартовый на примерах из GTA 5

Роман Самчук подготовил новый необычный курс для желающих выучить C#. Чтобы знания усваивались необходима практика, а что может быть интереснее и практичнее, чем мод для GTA V? Именно на его примере мы разберем все основные синтаксические конструкции языка и их особенности употребления. Видео будет крайне полезно новичкам в программировании.

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

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

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

В этом уроке будем работать с native function, которые есть в игре. Будет показано, как их можно вызывать, как передавать им различные параметры. Также, создадим машину с четырьмя врагами и попробуем из перестрелять.

Видео курс C# Базовый.

На первом уроке видео курса C# Essential будет рассмотрено: Концепции объектно-ориентированного программирования (ООП). Классы в языке C#. Основы работы с конструктором. Назначение и использование свойств (get, set). Главных парадигмы ООП.

В видео уроке «Классы и объекты. Диаграммы классов» будет продолжена тема урока «Введение в OOП. Классы и объекты», а также будет раскрыта тема возможности языка программирования C# разделять определение класcа между двумя и/или более файлами, именуемая частичными или partial классами. После ознакомления с частичными классами в С#, будут рассмотрены диаграммы классов, связи отношений между классами такие как ассоциация, агрегация, композиция, реализация, самоассоциация зависимости и другие.

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

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

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

В видео уроке будут рассмотрены статические классы, принципы создания и практического применения статических членов. Также, в ходе видео урока будет объяснена работа и использование расширяющих методов.Во второй части видео урока тренер рассмотрит понятие вложенных классов и шаблон проектирования «Одиночка» (Singleton).

Описание: В видео уроке будет представлена полная информация о структурах, рассмотрены отличия между классами и структурами, а также рассказаны практические советы по их применению. Структуры — фундаментальные типы данных в языке программирования C#.

В данном видео уроке будут рассмотрены такие понятия как упаковка (boxing) и распаковка (unboxing), структурный тип DateTime, а также работа с перечислениями(enum). В ходе занятия тренер ознакомит студентов с практическими примерами, которые позволят с легкостью использовать и применять полученные на уроке знания.

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

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

Описание: В видео уроке «Ограничения универсальных шаблонов» Вас ждет продолжение знакомства с универсальными шаблонами в C#. Вы узнаете, каким образом можно использовать ограничения для обобщенных типов данных. В ходе видео урока тренер остановит Ваше внимание на работе с Nullable типами, а также операциях поглощения, показав примеры практического их использования.

Весь видео урок будет всецело посвящен работе с событиями в C#. В деталях будет рассмотрено, каким образом создавать «издателей» и «подписчиков», а также обращаться к созданным событиям и вызывать их. Тренер уделит отдельное внимание делегату EventHandler и базовому классу EventArgs, а также работе с ними

В процессе просмотра видео урока Вы получите основные сведения, которые потребуются Вам для работы с многопоточностью в языке программирования C#. Многопоточность — важное средство многозадачного программирования среды .NET. Видео урок даст Вам основное понимание многопоточности в языке программирования С#. Также в ходе урока тренер расскажет Вам об использовании делегатов ThreadStart и ParameterizedThreadStart и объяснит работу с критическими секциями, как средствами синхронизации доступа потоков к различным разделяемым ресурсам.

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

В этом видео уроке Вы узнаете какие системные исключения существуют в языке C# и как правильно обрабатывать исключительные ситуации с помощью конструкции try — catch — finally. Также вы научитесь создавать свои объекты исключения. При выполнение приложения может сложится ситуация, когда корректное выполнение приложения невозможно. Например, приложение читает файл на диске, которого нет.

В данном видео уроке тренером будет рассмотрен базовый класс object его применение и использование, а так же техника перегрузки операторов. В процессе объяснения будет затронута техника клонирования, а также будет рассмотрено назначение шаблона проектирования «Прототип» (Prototype) и интерфейса ICloneable.

Данный видео урок будет очень важен для понимания всех современных технологий. В ходе видео урока тренер познакомит Вас с основами LINQ, а также с анонимными и динамическими типами, которые активно используются при построении запросов. Язык LINQ — это набор функций, который позволяет значительно расширить возможности синтаксиса языка программирования C#.

В этом видеоуроке Вы узнаете, что такое пространства имен и как правильно организовывать проект используя пространства имен. Также Вы узнаете, как создавать библиотеки (DLL) в языке C#. Тренер рассмотрит тип проекта Class Library и на простом примере объяснить для чего используются библиотеки.

Углубление в C#
Страница 6. Пространства имен в C# и Java

Осборн: Кажется, существуют различия между тем, как нам следует смотреть на пространства имен в C# и Java. Концептуально это одно и тоже? Или они реализованы по разному?

Хейлсберг: Концептуально да, но их реализации вовсе не похожи. В Java имена пакетов имеют также и физический смысл, который указывает на структуру директорий ваших исходных файлов. В C# мы имеем полное разделение между физическим расположением и логическим именованием, так, если вы вызовете ваше пространство имен, то ничего не произойдет в реальном физическом хранилище вашего кода. Это дает вам свободу располагать модули вместе в физических пакетах, не принуждая вас иметь соответствие в директориях. В самом языке, конечно, тоже существуют отличия. Так как в Java пакеты имеют также и физическую структуру, исходный файл должен располагаться в верной директории и иметь только один public класс или public тип. В виду того, что в C# нет такой связи физического и логического расположения, вы можете именовать свои исходные файлы как захотите. В каждом файле может содержаться несколько пространств имен и несколько public классов. Таким образом вы можете записать весь ваш исходный код в один файл или расположить его в нескольких маленьких. Концептуально во время компиляции происходит следующее — вы передаете все исходные файлы вашего проекта компилятору, а он уже решает что с ними делать.

Осборн: У меня есть вопрос о настраиваемом программировании: Вы считаете, что это важная концепция и она должна быть частью объектно ориентированного языка. Если это так, то каковы ваши планы реализацию настраимового программирования, как части C#.

Гудхью: Кое-что из того, что мы собирались включить в первый релиз, было создано — вопреки тому, что все думают о Microsoft — у нас нет неограниченных ресурсов. Мы приняли несколько трудных решений о том, что действительно будет в первом релизе.

Хейлсберг: В отношении настроек, о которых вы спрашивали — Я определенно думаю, что это очень полезная концепция. Нужно отметить что все исследования настроек происходили в академии и индустрии. Шаблоны — решение для этой проблемы. Во время наших внутренних обсуждений мы решили, что хотели бы включить это в нашу новую платформу. Чего мы действительно хотим — чтобы среда выполнения понимала настройки. Это отличается от того, как некоторые прототипы настроек были построены. Возьмите понятие стирания (erasure) в Java, в действительности у системы нет никаких представлений о настройках. Имея понимание концепции настроек, как в CLR, множество языков могут добиться большей функциональности. Вы можете писать на C# настраиваемый класс, а другой человек в другом месте будет работать с ним, используя другой язык.

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

Добавив понятие настроек в общую среду выполнения, она стала понимать, что когда приложение или компонент запрашивают у нее список всех «Foo», оно задает себе вопрос «Имею ли я на данный момент реализацию (код, создающийся при вызове настраиваемой функции, в зависимости от параметров) списка Foo?». Если это так, использует его. Так, если Foo тип, передаваемый по ссылке, то реализация может быть одна для всех ссылочных типов. Если же тип, передаваемый по значению (вроде int или float) — то для каждого типа будет своя реализация. Но только тогда, когда приложение запрашивает ее. Мы проделали всю основную работу, необходимую для добавления распознавания настроек в среду выполнения.

Интересна связь между IL и распознаванием настроек. Если инструкции в IL содержат информацию о типах, например, если сложение это не сложение, а сложение int, сложение float или сложение double — у вас нет возможности настроек в таком случае. Наш формат IL вправду нейтрален к типам. И по причине нейтральности к типам, мы можем добавить возможность настроек позже, без каких-либо для нас проблем. Это одна из причин, почему наш IL выглядит иначе, нежели Java байткод. Он у нас нейтрален к типам. И инструкция сложение — это сложение двух элементов, находящихся вверху стэка. Это может быть преобразовано в иной код, когда настройки будут реализовываться.

Осборн: Это доступно во всех языках платформы .NET?

Хейлсберг: Да. Исследовательский центр Microsoft Research в Кэмбридже создала версии общей среды выполнения и компилятора C#, допускающие настройки. Мы ищем путь внедрения этого. Похоже что этого не произойдет в первом релизе. Но мы сейчас работаем над тем, чтоб убедиться, что не делаем каких-либо вещей в первом релизе, которые не восприняли бы картины настроек.

Осборн: Когда вы планируете выпустить C#, платформу .NET и следующую версию Visual Studio?

Гудхью: Мы уже раздали здесь обзорную версию технологии 6500 посетителям конференции. Мы собираемся некоторое время (2000 год) использовать beta версию, а далее, когда все будет готово, сделаем релиз. Одна из вещей, которую мы действительно проделали — это подробный анализ, того, как прошел релиз Windows 2000, и путей вовлечения некоторых клиентов в процесс разработки и распространения. В случае платформы .NET и Visual Studio, мы будем вновь работать с клиентами, чтобы понять, когда все это действительно будет готово к релизу. Пусть они скажут нам, когда продукт готов. И по причине того, что в процесс вовлечены реальные клиенты, продукт обещает быть качественным. Другой стороной этого процесса является приобретение некой неопределенности. Мы ориентируемся на качество продукта, а не просто выбираем дату выпуска.

Осборн: Таким образом дату, когда будет написан весь код, вы заменяете датой, когда продукт будет готов работать?

Гудхью: Да это так. Я думаю, что разработчики узнают релиз Visual Studio .NET, как один из наиболее качественных релизов за всю историю Microsoft.

C Sharp

Народ требует хлеба и зрелищ!
Народ требует иллюстраций к статье!
В конце концов, если бы мы хотели почитать, мы бы пошли в библиотеку.
НЯ!
Эта статья полна любви и обожания.
Возможно, стоит добавить ещё больше?

C♯ («Си-шарп» и некоторые его ни разу не верные произношения: Шарфик, Си-сярп, Си-решетка, Цэ-острый, До-диез, Си-диез, Цэ-решетка, Си-вафля, Цесарка, Сисетка, C-Pound) — мейнстримовый язык для промышленной разработки на платформе .Net, объединивший в себе мощь Java и простоту C++. Наряду с жаббой же является стандартом де-факто энтерпрайза (чем и обуславливаются высококультурные диалоги между адептами противоборствующих сторон). В силу своей молодости ещё достаточно девственен, но уже успел затрахать всех. Люто, бешено ненавидим линуксоидами.

По большому счёту — это Жаба с припаянным сбоку С++ и парой ( функциональных => фич ) .

Содержание

[править] История

Давным-давно корпорация «Sun» решила разработать язык для стиральных машинок, но ввиду отсутствия в те времена в них интернетов, «изобретение» плавно переехало на серверы. Разработки его велись более 5 лет с привлечением истинных гуру вроде Никлауса Вирта, чья реализация сборщика мусора попала в код первых версий. Java начала свою историю как язык для корпоративного сектора (если пропустить самое начало, когда он был языком для микроволновок), энтырпрайзность зашкаливала за все границы: писали громадные спеки и стандарты и всё ковалось закрыто в Sun Microsystems. Технологически это всё же было лучше чем то, что создавалось до этого — особенно для задач, когда нужно писать бизнес-логику и не думать о том, завалится оно или нет, как завалится и что делать.

В то время набрал обороты Microsoft, вплоть до полного доминирования на рынке почти всего в IT. Жабба им нравилась, или по крайней мере они хотели захватить над ней контроль (применив к ней свою любимую стратегию EEE). После пары неудачных попыток (ака Microsoft Java и J++) они решили сделать свою жабу c указателями и делегатами и назвали её .NET.

Жаба тех лет отличалась невменяемостью стандартов, странными инженерными решениями (доступ к файлам через потоки, загрузка картинок в фоновом режиме и так далее), и исправлять было что. Саму жабу вылечить от этого нельзя, потому что полностью навернётся обратная совместимость и придётся ставить 10 версий одновременно. Кроме того, исправленную Java было бы крайне сложно отличить от .NET. Ну и плюс, она существует под множество платформ и менять её непросто.

.NET сделали за два года, и это было именно то, что надо для большинства Windows VS/Delphi-программистов. Чуждые UNIX-паттерны, которыми пахнет Java, изучать не нужно. Плюс .NET имел много хороших фич вроде ( лямбд => и замыканий ) , которых в жаббе не было до восьмой версии. По сравнению с Java, .NET — это отсутствие мук выбора, «one true way», бо́льшая выразительность языка, лёгкий доступ к unsafe, хорошая поддержка десктопного GUI. С другой стороны — зависимость от MS, вера дотнетчиков, что тот опенсорс, который они видят для .NET, это The OpenSource, а не детский сад в песочке с лопатками (как ни кричи на форумах о Mono — твоя платформа винда и тчк). Но в ноябре 2014 года Microsoft перевел .NET Framework под MIT-лицензию и стал неспешно открывать исходный код фреймворка. Злые языки говорят — потому что сами они даже минимально необходимый уровень функциональности и качества для удержания своего положения на этом рынке поддерживать уже не способны. Так что остается надеяться, что через годик-другой приложения .NET на UNIX, станут делом более-менее обыденным, что б там джаверы себе ни думали.

Алсо, во имя исторической справедливости надо вспомнить, что идеологически Java и .NET — полные противоположности: Java — множество платформ для единого языка, .NET — единая платформа для множества языков. Но на самом деле, что одно, что второе — множество языков для множества платформ.

Изначально C# казался неоднозначным: почти полный клон Java без всякой кросплатформенности, но с парой новых фреймворков: WinForms и ASP.NET WebForms, который превращал веб-программирование в подобие десктопного. Сейчас они выглядят нелепо, но тогда этот подход обернулся вином. Во второй версии Мелкомягкие добавили в язык ещё синтаксического сахара и довели до ума ASP.NET. И уже с .NET второй версии началось отставание Java как языка. Затем в .NET 3.5 появился LINQ (основной аргумент шарпистов в срачах с жаббаистами) и три фреймворка: десктопный WPF, сервисный WCF и вебовский MVC. Наконец, .NET 4.0 кардинально упростил параллельное программирование, а .NET 4.5 — асинхронное.

[править] Анти-История

Существует и альтернативная версия, что создатель C# придумал .NET, пока работал на Borland. Но там его не поняли, и он ушел в Microsoft писать J++, а потом умело пропихнул свою идею и всё заверте. И что были даже какие-то разборки между Borland и Microsoft на тему авторства.

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

[править] Инкарнации

C# имеет ни больше, ни меньше три разных синтаксиса. Ну или, если хотите, существует три языка с абсолютно идентичными возможностями и структурой, но разным синтаксисом. Этот майндфак стал реальностью благодаря очередной попытке Мелкософта решить важную мировую проблему: дефицит программистов. Цимес в том, что программистом может стать далеко не каждый (речь, разумеется, не о быдлокодерах). Нужно совмещение в человеке взаимоисключающих параметров, вроде технического склада ума и чувства прекрасного (подобный склад мышления должен быть свойственен, например, архитекторам, но на практике…). Но кроме того, что программеров мало, они ещё и пишут на разных языках. То есть жаббаист нихуя не способен педалить РНР-сайт, обратное верно. Конечно, можно заставить программера выучить новый язык под проект, но во-первых, эти гады, пользуясь дефицитом на рынке труда, могут спокойно послать работодателя в жопу и перейти к конкуренту через дорогу, а во-вторых, учить язык он будет недели 2-4, причём за счёт компании. И вот какого-то сумрачного мелкософтовского гения осенило: а пусть программеры пишут на любом языке, всё равно всё скомпилируется в один и тот же байткод. Профит очевиден: нужно искать не жаббаиста, или PHPетушка, или обгвидка, а тупо программиста. Это и было (если верить мелкософт-овцам) смыслом дотнета — этакая прослойка между языками. IRL схему ждал былинный отказ: если одна часть проекта на C#, а вторая на IronPython, то приходится держать в команде минимум одного шарписта и минимум одного обгвидка, потому что код друг друга они не понимают и при необходимости малейшего баг-фикса или модернизации, в лучшем случае, придётся перепедалить всё заново (в худшем пофиксят так, что потом всё равно придётся).

  • C# — ну собственно основной язык под .net с С-подобным синтаксисом. Большинство дотнетчиков кодят именно на нём.
  • VB.net — тот же C#, но с бейсико-подобным синтаксисом. С VB 6, разумеется, несовместим, хотя есть возможность, не без танцев с бубном, перекомпилить программу на VB6 под .NET, однако работоспособность получившегося франкенштейна никто не гарантирует. Жив.
  • J# — попытка мелкософта приучить жаббаистов к .net. Fail, ибо в синтаксисе Java и C# на тот момент и так было полтора различия, а порядочно отличающуюся стандартную библиотеку жаббы имитировать, естесно, не стали. Выпилен.
  • C++/CLI — C++ под .net. Nuff sa >[править] Особенности языка
  • Компиляция в промежуточный язык.
  • НИКАКАЯ защита кода. Если программа на С++ поддаётся декомпиляции только при глубоких познаниях в (диз-)ассемблере и Дао, то в C# исходный код программы легко и просто получается программками типа Reflector в доли секунды и декомпилируется без ошибок вплоть до названия переменных [1] . Полученная декомпиляция отличается от авторской разве что отсутствием комментариев — такой вот Open Source поневоле. Единственная защита — сторонние программы-обфускаторы, после которых декомпилированный код абсолютно нечитабелен. Впрочем, это верно и для Жабы, и вообще для всех языков, которые компилирует в байт-код. Но всем похуй, ибо если ты кодишь систему грамотно, то Еве от прочтения кода легче не станет; а если ты кладёшь болт на безопасность, то тебя никакой обфускатор не спасёт.

[править] Плюсы языка

  • Средний порог практического вхождения для знакомых с каким-нибудь языком, похожим на C(спойлер: C/C++/BCPL/B/CPL/D/Java/J++/J#/AS3/PHP/Limbo/Go/Vala/Alef — тысячи их), и соответственно нехилый для тех, кто с такими языками вообще незнаком. Впрочем, количество незнакомых с Це-синтаксисом кодеров исчезающе мало — это либо окончательно задеревеневшие мозгом дельфикодеры, либо веобу-функциональное небыдло с крайней степенью ФГМ.
  • Полностью ООП, даже элементарные типы данных.
  • Тонны синтаксического сахара начиная с третьей версии.
  • JIT-компиляция производится сразу в команды целевой архитектуры (как бэ на то она и JIT). То есть конечная программа собирается специально под ту машину, на которой запускается. Разруливание битности архитектуры берёт на себя как раз JIT-компиляция.
  • Огромное количество уже готовых классов на все случаи жизни, только и ждущих, чтобы ими воспользовались. Не надо ничего придумывать. Всё уже есть, осталось только скопипастить примеры из документации.
  • Для языка есть собственная среда разработки.
  • В разработке языка участвовали отцы Хаскелля и Delphi.
  • Наличие event-ов и, соответственно, встроенного обработчика событий.
  • Присутствует возможность работать с памятью напрямую (что критикуется тру-программистами).
  • Есть служба «Microsoft .NET Framework NGEN», которая сразу компилит в нативный бинарь и кэширует этот бинарник для его последующих запусков.
  • Интеграция с неуправляемыми языками одной командой (в частности с С и С++). Нужны функции кернела? Легко! Некоторые умудряются скомутировать даже с Фортраном.
  • Есть настоящие (а не только вложенные) многомерные массивы и опционально — проверка переполнения.
  • Функциональщина. Полноценно применять ФП нельзя: отсутствует нативное каррирование. Но даже то, что есть может здорово облегчить код и логику.
  • В ноябре 2014 внезапно выпустили VS Комьюнити Эдишн — бесплатный вариант VS Professional. Бесплатное использование для индивидуальных разработчиков в любых целях, для организаций с (числом ПК [править] Минусы языка
  • Чтобы вести нормальную коммерческую деятельность в этой стране, придётся затариться лицензиями Windows и Visual Studio (впрочем, существует и достаточно функциональная бесплатная версия). Кроме того, существует открытый аналог VS — SharpDevelop, написанный, вы не поверите, на шарпе. Вполне успешно мимикрирует под VS, реализуя большую часть ее функционала, позволяя невозбранно быдлокодить на решетках и VB.NET.
  • В синтаксическом сахаре зарыты неочевидные для индусов способы выстрелить себе в ногу. Но так как сахар индусы не любят — всем как всегда.
  • Из-за огромной любви Билла Гейтса к базику сохранён эпический оператор GOTO. Что странно, потому как другие сомнительные операторы и конструкции из языка выпилили. Впрочем, для тех, кто «Дисциплине программирования» Дейкстры, предпочитает «Искусство программирования» Дональда Кнута — это не минус, а плюс, потому что Кнут в отличие от Дейкстры, GOTO ненавидевшего, умел его использовать с умом и толком.
  • Присутствует возможность работать с памятью напрямую, что убивает зайчатки надёжности, но позволяет делать эпичнейшие по своей убойности костыли. Сделано, как это обычно бывает у Microsoft, из маркетинговых соображений [2] .
  • Видимо, по той же причине были оставлены беззнаковые целые — штука довольно полезная, когда приходится воевать за каждый байтик, ну, или хотя бы за килобайтик, но абсолютно ненужная в ынтырпрайз-приложухе, которая уже на старте отжирает несколько десятков гигабайт, и при этом позволяющая заработать весьма неочевидные баги, на поиске которых поседел не один десяток программистов.
  • В отличии от жабы и прочих мейнстримовых языков с виртуальными машинами методы классов по дефолту не виртуальные. Нафига это сделано — непонятно: добавляется лишний синтаксический сахар, увеличивается вероятность пусть и легко обнаруживаемых, но все же ошибок, при этом прирост по производительности весьма сомнительный.
  • Таки проигрывает пресловутой жабе и ее потомкам по скорости работы, хотя нужно признать, что в данный момент процветает куча языков, уступающих по этому параметру решеткам. Как всегда, все познается в сравнении.
  • Для использования инструментов «из коробки» зачастую нужно изрядно потрахаться с конфигами.
  • Язык создан Империей добра, в отличие от альтернативы, порабощенной компанией зла.
  • В разработке языка участвовали отцы Хаскелля и Delphi.
  • Как и всё от майкрософта, встроенные библиотеки работают только с другой продукцией майкрософта. Например, реализация клиента SMTP.
  • Это всё-таки язык с парадигмой «чтобы легче писалось», а не «чтобы лучше работало». Как, впрочем, и жаба, и почти всё, появившееся после Си. Отличается сабж тем, что умело маскируется под нормальный язык (дьявол скрыт в таких детальках, что надо быть вторым Дональдом Кнутом, чтобы заметить западло вовремя), в результате чего быдломенеджеры принудительно пихают его в такие разработки, в которым ни ему, ни самим этим менеджерам не место, примерно как не место, скажем, ардуине в проекте «Вояджер».

[править] Mono/Xamarin

Свободная кроссплатформенная реализация данного C# и .NET. Главный разработчик — Мигель де Иказа, до этого прославившийся как один из разработчиков Gnome. Сейчас уже реализована поддержка .NET 4.5 (кроме, разве что, OLE).

Эта среда породила немало специальных олимпиад, в частности, на ЛОРе. Срачи обострились после призыва одного полоумного бомжа отказаться от C# для разработки свободных приложений, поскольку патенты на данный язык принадлежат Microsoft (что конечно же не совсем так, ибо C# и CLR являются стандартами ECMA-334/335, что и позволяет свободно запилить свой фреймворк (как например тот же Mono) с сами знаете чем). Устные обещания не предъявлять по ним претензии бомжа также не устроили, так как, по его, бомжа, мнению, они — филькина грамота.

Аргументы сторонников моно и Мигелюшки следующие:

  • Во всех странах, кроме пиндостана, патенты на ПО не действуют.
  • В тех же, в которых действуют, они распространяются только на коммерческое использование патентованных технологий. Аргумент не совсем состоятельный, поскольку свободное ПО по определению может использоваться и в коммерческих целях. А ПО, которое обладает всеми критериями свободности, за исключением коммерческого использования, в терминологии Столлмана называется полусвободным и относится к несвободному.
  • Для некоторых задач более свободной альтернативы нет, а изобретать велосипед смысла не имеет, по вышесказанным причинам. Тоже не очевидно, противники Mono предлагают, например, Python. Раньше предлагалось использовать жабу, но после недавних событий она тоже стала не нужна (с тех пор тучи рассеялись, потом снова сгустились… но кто знает, что будет завтра?).
  • Бо́льшая часть .NET изложена в стандарте ECMA, а эту часть Microsoft сам выпустил под свободной патентной (не софтварной) лицензией. Остальное для работы линуксового монософта не нужно (только для совместимости с виндовым). Это мнение указано в FAQ проекта Mono.

Позже Столлман назвал Мигеля предателем сообщества за то, что тот интегрирует Mono в Gnome, а также за другие не очень хорошие дела, например, за сотрудничество с MS с целью переноса свободных программ на Windows. В ответ Мигель заметил, что Господь любит всех живых существ, даже Столлмана. Вообще весь .NET является причиной попоболи всех красноглазых, поскольку уже сам факт его существования часто становится доказательством того что линукс не нужен не только на десктопе, но и на сервере (никто ведь не будет запускать серьезный проект под Mono). Множество успешных проектов на ASP.NET и вебсервисов тому доказательство.

Переименовались в Xamarin и коммерциализировалось: инди-лицензия на Xamarin.Android (который раньше был MonoDroid) или Xamarin.iOS (MonoTouch) стоит $300 в год. За всё вместе — $540. Для компаний каждая обойдётся в целый килобакс. Вот вам и свободная реализация. Впрочем остальные реализации по-прежнему бесплатные, что позволяет невозбранно писать на C# под Gnome или Windows. Правда студенты могут бесплатно получить Xamarin.Android и Xamarin.iOS тут

24 февраля 2020 года Xamarin был с потрохами куплен мелкомягкими и стал бесплатным для разработчиков небольших компаний пруф.

[править] Unity3D

Мультиплатформенный игровой движок, который работает везде. То есть вообще везде: совместим с Windows, Linux, OS X, Android, iOS, Wii, PlayStation 3, Xbox 360 и даже в браузере запускается (с помощью трансляции в JavaScript/WebGL). Разрабатывался тремя школьниками, которые хотели написать игру, но не могли договориться какую. В итоге решили сначала написать движок с инструментарием и всё заверте… В общем, пацаны пришли к успеху. На данный момент — один из основных конкурентов Unreal Engine и наиболее перспективное направление для начинающего игродела.

Хорош он не только мультиплатформенностью, но и мощной средой разработки, которая позволяет запускать игру прямо в редакторе, а также широкой поддержкой различных форматов. Но самое главное — язык скриптов, которым и является сабж. В то время, как на большинстве коммерческих движков приходится использовать или C++, или встроенные языки, типа богомерзкого UnrealScript, Unity3D предлагает кодить на тёплом ламповом Шарпе (а также диалектах js и Питона). В серьёзном бизнесе пока что непопулярен (ибо всё ещё выдаёт картинку похуже конкурентов), но большинство перспективных кикстартеских проектов делают именно на нём (в том числе Wasteland 2 и Torments Tides of Numenera).

Примечательно, что сам движок пишется на C и C++.

[править] Холивары

[править] C# vs Java

Одна из основных дисциплин специальной олимпиады быдлокодеров (потому что для настоящего программиста язык вторичен). Цимес в том, что Жаба и Шарп — аналоги, да ещё со схожим синтаксисом. Казалось бы, живи и радуйся, но нет, сотни быдлокодеров тратят сотни рабочих человеко-часов, доказывая друг другу, чья прелесть прелестнее.

Когда Шарп только вышел, это была покоцанная Жаба с несколькими С++ фичами и парой фреймворков, которые вчистую сливали аналогам. Кросплатформенность оказалась весьма условной (то есть весь код — Windows only). Жабаисты и дельфяры напророчили шарпокапец и успокоились. А зря, ибо вторая версия Шарпа нагнула Жабу по возможностям, и даже ASP.NET наконец-то стал генерить веб-странички вменяемых размеров. Но настоящая драма развернулась после выхода третьей версии. Внезапно появился LINQ, который многократно упростил обработку данных, а также WPF/WCF/MVC. Пощипывание пониже спины выросло в жгучую попаболь, и быдлокодеры кинулись на баррикады: жабаисты доказывать (прежде всего самим себе), что шарп не нужен, а шарписты — наоборот. Ситуация ещё больше усугубилась с выходом 4 версии Шарпа, в которой многопоточное программирование стало детской забавой, а в 5-й версии async и await заставили брызгать испаряющейся кислотой.

  • Относительно вменяемый (по меркам ООП) синтаксис с минимумом ключевых слов. Язык проще в освоении благодаря более последовательному развитию.
  • Отсутствие переподвывертов родом из Pascal вроде ref и out. И уж тем более наркоманских «bool?», «long?» (bool + null).
  • Принудительная типобезопасность (а не типа-безопасность) без unsafe и прочих б-гомерзких goto.
  • Хотя бы условная кроссплатформенность большинства сопутствующих технологий (тот же javafx).
  • Разнообразие бесплатных сред разработки. Причём они, в отличие от платной VS, не зависают на 3-5 секунд при использовании Ctrl-X.
  • Вменяемая структура наследования: несмотря на присутствие всякой хреноты из времён зарождения ООП (вроде abstract class), Java оставляет заметно меньше способов прострелить себе ногу.
  • Есть хоть какая-то оптимизация: Java работает заметно быстрее C#. Спорное утверждение: апологеты жабы любят приводить сравнения скорости работы разных программ в разных средах, а так же обожают сравнивать один-в-один переписанный код, что не совсем корректно, так как среды разные и способы оптимизации тоже. В таких условиях и C++ иногда медленнее Java. В любом случае, свежий .NET Core сильно быстрее своего Windows-only предшественника .NET Framework, так что холивар вспыхнул с новой силой.
  • Обратная совместимость и поддержка. В отличие от Microsoft, продукт не приходится переписывать каждые 3-4 года из-за того, что ваша версия JVM объявлена deprecated.
  • Вывод функций не зависит от локали и прочих настроек системы.
  • Хороший, годный StreamAPI начиная с Java 8.

Основной аргумент джаваистов: А у нас полная кроссплатформенность, а у вас?

  • A у нас Моно. Моно всё-таки имеет ограничения, да и выходит с опозданиями. Хотя в последнее время его начинают довольно активно использовать в Ынтерпрайзе.
    • Mono не поддерживается Мелкософтом. В этом случае можно сделать троллфейс и объяснить оппоненту, чем славен Мигелюшка. Если до этого звучали упрёки в анальном рабстве у Мелкософта, то следует объявить, что жабаисты в анальном рабстве у Оракла, раз уж мусье не признаёт сторонних реализаций JVM.
  • Далеко не всем программам нужна кросплатформенность, особенно в энтерпрайзе. Да и любое кроссплатформенное решение страдает именно оттого, что вынуждено быть чересчур универсальным, вследствие чего многие выгодные особенности конкретной платформы часто приходится либо игнорировать, либо реализовывать дополнительные слои абстракций, чтобы эти особенности были доступны и на других платформах.
    • Mono не доверяют и использовать не будут. Любой .NET-кун, который не раз и не два попадал на моно проекты, сразу же скажет, что это хуита, но проверять никто не будет и доказать ничего нельзя
  • Будет очень скоро, надо только подождать. И в 2020 дождались! Server Core теперь открытый и кроссплатформенный. Можно писать серверные приложения на C# под что угодно. Насчёт кроссплатформенных окошечек — это то ещё мучение даже на Java со свежайшим JavaFX.
    • Карается баном.
  • Язык быстро развивается и постоянно внедряет фичи первым. Из свежего (версия 7), например, using static.
  • Есть структуры (как объекты, но передаются по значению) и для них не нужно писать отдельные контейнеры (IntStream, DoubleStream и т.п.).
  • Обилие замечательных способов прострелить себе ногу: ref, out, var, goto, адресная арифметика (с unsafe, требует включения компиляторной фичи и не используется почти никогда). Для гурманов есть is и as с приведением подтипов во время исполнения. Ваш быдлокодер купил бы себе Visual Studio!
  • Nullable-типы значений: int? bool? и тп. В C# 8.0 хотят так же ввести обязательное указание nullable и для ссылок, которые сейчас по умолчанию всегда могут быть null. Да здравствует строгая типизация!
  • JetBrains Ra > вместо ->), свойства, вменяемые модификаторы доступа по умолчанию, var, интеграция IEnumerable не только с foreach, но и с функциями произвольного числа аргументов, ссылки на функции.
  • Microsoft делает ставку на CLR: в отличие от Java, которая использует .jar (архивный формат), байт-код CLR гордо именуется exe-шником и поддерживается системой «из коробки» (системой, в которой «из коробки» нет ни драйверов, ни кодеков, ни нормального браузера).
  • Microsoft не стесняется ломать обратную совместимость раз в несколько лет, выкидывая накопившееся legacy и вынуждая разработчиков заниматься тем же, что положительно сказывается на качестве разработки в целом. Там, где на Java вас заставят ковырять нечто, что было написано в середине нулевых и запускается под IE6 (кроссплатформенность, ага), на .NET вам чаще придется переписывать примерно 40% кода 5-летней давности, потому что хостинг Azure больше не поддерживает ваш уютненький .NET 4.2 родом из 2012го. А при переписывании кода каким-никаким рефакторингом все равно озаботишься. Даже если это делается по-принципу «хуяк-хуяк и в продакшн», разгребать свежее местечковое говно куда проще, чем окаменевшее и вросшее в фундамент говно мамонта.
  • В C# стандарт строже.

Основной аргумент шарпистов: А у нас в квартире газ LINQ, TPL, свойства, лямбды, замыкания и ещё куча ништяков, а у вас?
Ответ: не нужно. Весьма примечательно, что джаваисты объявляют ненужным абсолютно всё ровно до того момента, пока в Джаве это таки не появляется. После этого фича внезапно становится нужной и полезной. При этом, у Джаваистов принято люто фапать на Scala, которая состоит из вышеперечисленных ништяков чуть более, чем на половину.

[править] C# vs VB.NET

Внутрений .netовский холивар. В отличие от предыдущего, ведётся даже не быдлокодерами, а конченными хеллоуворлдщиками. Дело в том, что C# и VB.NET — это одно и то же. Да-да, мой юный падаван, возможности этих языков абсолютно одинаковы, и единственное различие между ними — синтаксис. В C# он C-подобный, а в VB.NET — Бэйсико-подобный. И всё. Таким образом, участники данной специальной олимпиады спорят о том, что круче: скобочки или энды.

Луговский подобные кадры охарактеризовал следующим образом:

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

О так-то. Если вы узнали, что ваш коллега участвует в подобном холиваре — бейте его талмудом Макконнелла по голове до просветления.

Исключение: в C# все-таки возможно напрямую работать с памятью (unsafe code) в обход CLR, что невозможно в VB.NET, хотя подобные свойства в языке используются чуть реже, чем никогда. Ну а ещё VB.NET case-insensitive по умолчанию — дань предкам, однако.

Исключение № 2: В С# по-умолчанию нет некоторых функций, которые есть в VB.Net. Например, IsNumeric(). Которая, однако, может быть вызвана добавлением в проект референса Microsoft.VisualBasic.

Исключение № 3: Синтаксис (и местами поведение — привет, VB.NET-ный автотайпкастинг!) того же LINQ отличаются, внезапно, не в пользу C#. Однако небыдлокодерам похуй — они давно пишут LINQ-запросы соответствующими методами, предсказуемо смотря на литеральный LINQ, как на сами знаете что.

Суть: и VB.NET, и C# в итоге компилируются в IL, и виртуальная машина оперирует IL инструкциями, CLR знать не знает ничего, ни о C#, ни о VB.NET (о них знают только компиляторы), и из этого вытекают отличия языков — какую фишку CLR добавили в язык (все .NET языки должны поддерживать CLS, но возможности CLR шире, можно вообще используя грязные хаки и Mono.Cecil нагенерить сборку с тем, что ни в одном языке не разрешено, но разрешено в CLR). Обычно все новое вначале добавляют в C#, а позже в VB.NET, но иногда, бывает и наоборот. Пример: конструкция catch when в VB.NET, которую таки добавят в C# 6

[править] C# vs PHP

Один из самых невменяемых быдлокодерских холиваров. Дело в том, что C# популярен в виде бэкэнда для веба. И хотя он, в отличие от РНР, может использоваться и для десктопа (WinForms, WPF), и для мобайла (Modern, Xamarin) и даже для геймдева (XNA, Unity3D), бо́льшая часть .net вакансий — ASP.net. Ну и как следствие, ASP.net занимает второе место среди серверных технологий. И это только в общедоступном интернете, а в Ынтерпрайзе доля стремится процентам к сорока (остальное зохавано Жабой). Когда РНРетушки видят, что какие-то корпоративные шарпобляди делают сайты не хуже, за бо́льшую зарплату, да ещё и без привязки к домену, они испытывают лютейший баттхёрт и открывают на каком-нибудь SQL.ru или PHPClub.ru очередную тему «ASP.net не нужен». Туда обязательно набигаєт пара .net-кунов, и всё заверте…

Бо́льшая часть участников холивара отличается крайней некомпетентностью в обсираемой технологии. Ну, а хуле: если бы РНР-кодерок освоил ASP.net, он бы на нём и работал, а среднему дотнетчику не нужен РНР. В результате холивар часто мутирует в Windows vs Linux или Apache vs IIS. Разумеется, в целевой системе/сервере оппонента холиварщик тоже ничего не понимает. Иногда поциэнты даже не ленятся нагуглить какой-нибудь майндфак и потом используют его как главный аргумент в споре. Например, РНРишники очень любят рассказывать об ужасах ViewState, хотя в нормальном сайте он занимает от силы 10-20 кб, что компенсируется отсутствием повторных запросов к базе, причём он отключаемый, причём в ASP.net MVC или том же NancyFx его просто нет.

А на самом деле кодерки сравнивают МПХ с пальцем: РНР — динамически слабо и неявно типизированный перлоподобный язык для создания маленьких сайтов (о чём намекает расшифровка его названия: «Personal Home Page» Уже давно нет.[2] ), а C# — статически сильно и явно типизированный сиподобный язык для тырпрайза (о чём неоднократно говорили сами мелкософт-овцы). Не конкуренты они ни разу и общего у них ничего нет. Но всем как всегда.

[править] C# и штангисты

Пришло время воровать фичи! ККОКОКОКОКОКОКО! ИЧСХ, каждый раз умудряются поломать украденное.

Илон Маск рекомендует:  Работа с файлами office 2007 из командной строки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL