Questions tagged [c#]

C# (произносится «си шарп») — мультипарадигменный язык программирования, флагманский язык фреймворка .NET. Указывайте в вопросах метку используемой реализации Common Language Infrastructure ([.net-framework], [.net-core], [mono]), если вопрос относится к разработке приложений под эту конкретную реализацию или ее особенностей.

C# (произносится «си шарп») — быстроразвивающийся высокоуровневый мультипарадигменный объектно-ориентированный кросс-платформенный язык программирования общего назначения. Разрабатывался группой Андерса Хейлсберга в Microsoft с 1999 как главный язык разработки приложений для платформы .NET Framework. Сейчас разработка перешла в Open Source. Язык был стандартизирован как ECMA-334 и ISO/IEC 23270. Язык и платформа .NET портированы на другие платформы (Linux, OS X, BSD, Solaris) в рамках Open Source-проекта Mono/Xamarin, а также .NET Core.

Литература по C# собрана в этом вопросе.

Онлайн-компилятор, в котором можно посмотреть кодогенерацию для различных языковых конструкций, синтаксическое дерево, а также ассемблерный код, здесь: https://sharplab.io/ (пример). Другие популярные онлайн-компиляторы: ideone, .NET fiddle, RexTester.

Текущий черновик стандарта языка находится на docs.microsoft.com и разрабатывается в этом github-репозитории.


Существуют три основные реализации .NET:

  • .NET Framework (для работы с Windows Desktop, а также серверный вариант под Windows-платформу — ASP.NET),
  • .NET Core / .NET 5+ (кроссплатформенные консольные приложения, серверный ASP.NET Core и GUI-приложения только для Windows)
  • Xamarin, основанный на Mono, для приложений под iOS, MacOS и Android.

C# похож на своих предшественников — языки Java и C++ — как своим синтаксисом, так и ориентированностью на классы. Однако более поздние версии языка дрейфуют в сторону обобщённого, а далее и функционального программирования. Из важных особенностей языка стоит отметить

  • свойства
  • дженерики
  • частичная поддержка сопрограмм (посредством итераторов)
  • унифицированный синтаксис SQL-запросов, запросов к объектам и их коллекциям и выборки из XML (LINQ)
  • элементы функционального программирования
    • автоматическое выведение типов переменных
    • делегаты и лямбда-функции
    • ленивые вычисления (генератор-функции, монадические операции с последовательностями в LINQ)
    • явная доступность синтаксических деревьев (Expression<T>)
  • декларативная поддержка динамического типизирования (ключевое слово dynamic)
  • продолжения и независимые от стека асинхронные потоки выполнения (async/await)
  • поддержка взаимодействия с COM, нативным кодом и скриптовыми языками

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

Язык C# пользуется сборщиком мусора для управления памятью, тем не менее, поддерживается и детерминистическое управление ресурсами (IDisposable, конструкция using).

Язык полностью поддерживает интроспекцию времени выполнения.

Язык поддерживает компиляцию как в промежуточный код (который компилируется в нативный код JIT-компилятором во время выполнения), так и компиляцию в нативный код (AOT, NGen).

C# позиционируется как основной, флагманский язык платформы .NET. Язык обладает огромной стандартной библиотекой, включающей от парсеров различных форматов, до готовых классов по работе с сетью и криптографических вычислений, а также многочисленными фреймворками. Вот только некоторые из них: WPF, WinForms, ASP.NET Core, Unity 3D, WCF, Entity Framework, NHibernate, Moq, Microsoft Unity, Castle Windsor, NInject, PostSharp, NUnit.

Использование метки

Указывайте в вопросах метку используемой реализации Common Language Infrastructure (, , ), если вопрос относится к разработке приложений под эту конкретную реализацию или ее особенностей. Например, если вопрос касается взаимодействия с какими-то службами ОС, скорее всего, такая метка будет нужна, а для вопросов по синтаксису языка — нет.

Ссылки

Руководство по языку C#

ECMA-334 — C# Language Specification

42829 questions
76
votes
3 answers

В чем польза yield?

Пример на С#. Возвращаем коллекцию с помощью yield. public static class Foo { public static IEnumerable Test() { var rand = new Random().Next(1, 3); if (rand == 1) yield return 1; if (rand == 2) …
alex k
  • 903
35
votes
1 answer

Чем out отличается от ref?

Функция с параметром с ключевым словом out даёт такой же результат, как и с ref. Такой код: private void func(out string value) { value = "Hello World!"; } Даёт такой же эффект, как и private void func(ref string value) { value = "Hello…
david_I
  • 1,003
23
votes
2 answers

Объясните смысл новшеств C# 7

В новой версии превью Visual Studio "15" появилась вот такая конструкция, которая возвращает ссылку на объект: static void Main(string[] args) { int[] numbers = { 0b1, 0b10, 0b100, 0b1000, 0b1_000, 0b10_0000 }; ref int r = ref Find(numbers,…
iluxa1810
  • 24,899
21
votes
2 answers

Для чего действительно нужны локальные функции?

Вот в этом вопросе поднимается вопрос о планируемых нововведения в c# версии 7. В частности меня заинтересовали так называемые локальные функции. В ответе @VladD есть пример как может быть использована локальная функция: IEnumerable
Bald
  • 6,509
20
votes
4 answers

Написать синтез речи

Хочу написать синтез речи. Опыт работы с С# WinFoms. Подскажите, пожалуйста, как быстро и с помощью чего это сделать? Если есть готовое решение - круто. Предложите хоть какие-то варианты.
20
votes
3 answers

Как перемешать (случайно переставить) элементы в массиве?

Есть данные, записанные в массив или генерируемые на лету. Как можно получить их случайную перестановку в массиве или другом контейнере? Например: как можно получить случайную перестановку чисел от 1 до n в массиве/списке?
VladD
  • 206,799
19
votes
2 answers

Чем отличаются override и new

Да я знаю, что override переопределяет virtual, а new затеняет, но чем они отличаются на практике? Пример class A { public void DoSomeStuff(){} } class B : A { public new void DoSomeStuff(){} } Здесь я затенил, но если я захочу вызвать…
Vasya_P
  • 269
18
votes
2 answers

__line__ номер линии кода

Не первый раз приходится писать log1(613,"msg"); log1(614,"msg"); В с++ есть классная штука __LINE__ на www.cprogramming.com и с++ ф-ция логирования , есть ли простое решение для с# логирования именно строки, которая выполняется?
nick_n_a
  • 8,057
17
votes
1 answer

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

Почему приложение завершает свою работу? Ведь в деструкторе должно быть зацикливание: namespace Core { class Test { ~Test() { while (true); } } class Program { static void Main(string[] args) { …
17
votes
3 answers

Каким образом foreach узнаёт, что коллекция была изменена?

Как известно, если во время работы foreach коллекция, которую он перебирает будет изменена (в другом потоке, например), то произойдёт исключение. Но как устроен этот механизм исключений? Кто ответственен за обнаружение изменения? Должен ли я при…
4per
  • 2,696
17
votes
4 answers

Деление огромного числа

Есть огромное число в виде текстовой строки, 24 десятичных знака в длину (например, 345678923456789876543234). Это число надо разделить на другое, достаточно малое число (например, 97). Как выполнить деление, если из-за длины числа недоступен даже…
17
votes
1 answer

Контрактное программирование Code Contracts

Насколько активно стоит использовать контрактное программирование в проектах и как правильно? Столкнулся первый раз и не могу понять насколько полезная штука, с первого взгляда кажется очень заманчивым. P.S. Желательно применительно к C#.
NEvOl
  • 895
  • 7
  • 15
16
votes
5 answers

C# Игральный кубик с неравномерной вероятностью

Имеется игральный кубик с N количеством граней, сейчас вполне хватит 6. Кубик является не вполне честным, так как шанс выпадения граней неравномерный. Тем не менее, при броске гарантированно выпадает одна из граней. Шансы выпадения граней этого…
Qubk
  • 163
15
votes
3 answers

Как получить имя переменной внутри функции

Как можно получить имя передаваемой переменной в вызываемом методе? Только передавать дополнительным параметром? Может есть какой аналог CallerMemberNameAttribute только для получения имени передаваемой переменной? На примере: var variable =…
MihailPw
  • 6,384
15
votes
3 answers

Правильно ли в книге написаны примеры

Здравствуйте! Начал заниматься по книге C# для школьников и столкнулся сразу же с трудностью. А именно в примерах, которые приводят в книге не понятно почему подчёркивается всё красной линией и не работает. Допустим этот пример: using System; class…
Piston
  • 225
1
2 3
99 100