Today: Tuesday 27 July 2021 , 12:31 pm


advertisment
search




C Sharp

Последнее обновление 2 День , 1 час 107 Взгляды

Advertisement
In this page talks about ( C Sharp ) It was sent to us on 25/07/2021 and was presented on 25/07/2021 and the last update on this page on 25/07/2021

Твой комментарий


Введите код
 
{{Карточка языка программирования
name = С#
logo =
file ext = .cs
semantics =
paradigm = мультипарадигмальный:
объектно-ориентированный,
обобщённый,
процедурный,
функциональный,
событийный,
рефлективный
class =
year =
designer = Андерс Хейлсберг
разработчик = Microsoft
latest_release_version = 9.0
latest_release_date =
latest_preview_version =
latest_preview_date =
typing = статическая, динамическая, строгая, безопасная, вывод типов
implementations = , Mono, , DotGNU (заморожен), Universal Windows Platform
dialects = Cω, Spec#, , Enhanced C#
influenced_by = C++, Java«Поскольку язык С# унаследовал свой синтаксис от C++ и Java…» «Язык C# унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java», однако далее: «Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками» , Delphi, Модула-3 и Smalltalk
influenced = Cω, F#, Nemerle, Vala, Windows PowerShell, Kotlin
лицензия = Компилятор : Лицензия Apache 2.0
.NET Core CLR: MIT / X11
Компилятор Mono: dual GPLv3 and MIT/X11
DotGNU: dual GPL and LGPL
платформа = Common Language Infrastructure
Семейство =
C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота как язык разработки приложений для платформы Microsoft .NET Framework. Впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, переменные, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников — языков C++, Delphi, Модула, Smalltalk и, в особенности, Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественная реализация интерфейсов).

Особенности языка

C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.

Название языка

Файл:Treblecsharp5.svgthumb90pxНота
Название «Си шарп» (от англ. sharp — диез) происходит от буквенной музыкальной нотации, где латинской букве C соответствует нота До, а знак диез (англ. sharp) означает повышение соответствующего ноте звука на полутон , что аналогично названию языка C++, где «++» обозначает инкремент переменной. Название также является игрой с цепочкой C → C++ → C++++(C#), так как символ «#» можно представить состоящим из 4 знаков «+» .
Из-за технических ограничений на отображение (стандартные шрифты, браузеры и т. д.), а также из-за того, что знак диеза ♯ не представлен на стандартной клавиатуре компьютера, при записи имени языка программирования используют знак решётки (#) . Это соглашение отражено в Спецификации языка C# ECMA-334 . Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне ), «Майкрософт» использует знак диеза.
Названия языков программирования не принято переводить, поэтому язык называют, используя транскрипцию, — «Си шарп».

Стандартизация

C# стандартизирован в ECMA (ECMA-334) и ISO (ISO/IEC 23270) .
Известно как минимум о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:
  • Mono, начата компанией Ximian, продолжена её покупателем и преемником Novell, а затем Xamarin.
  • dotGNU и Portable.NET, разрабатываемые Free Software Foundation.

Версии

На протяжении разработки языка C# было выпущено несколько его версий:
{ border="1"
-
! rowspan="2" Версия
! colspan="3" Спецификация языка
! rowspan="2" Дата
! rowspan="2" .NET Framework
! rowspan="2" Visual Studio
-
! ECMA
! ISO/IEC
! Microsoft
-
C# 1.0
rowspan="2"Декабрь 2002
rowspan="2"Апрель 2003
Январь 2002
Январь 2002
.NET Framework 1.0
Visual Studio .NET (2002)
-
C# 1.2
Октябрь 2003
Апрель 2003
.NET Framework 1.1
Visual Studio .NET 2003
-
C# 2.0
Июнь 2006
Сентябрь 2006
Сентябрь 2005Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.
Ноябрь 2005
.NET Framework 2.0
Visual Studio 2005
-
C# 3.0
colspan="2" rowspan="2" Для версий языка C# 3.0, 4.0 и 5.0 пока нет утверждённых ECMA или ISO/IEC спецификаций.
Август 2007
Ноябрь 2007
.NET Framework 3.5
Visual Studio 2008
-
C# 4.0
Апрель 2010
Апрель 2010
.NET Framework 4
Visual Studio 2010
-
C# 5.0
Декабрь 2017
Июнь 2013
Август 2012
.NET Framework 4.5
Visual Studio 2012
-
C# 6.0
colspan="2"
Июль 2015
Июль 2015
.NET Framework 4.6
Visual Studio 2015
-
C# 7.0
colspan="2"
Март 2017
Март 2017
.NET Framework 4.6.2
Visual Studio 2017
-
C# 8.0
colspan="2"
Сентябрь 2019
.NET Framework 4.8
Visual Studio 16.3.0
{ ;
  • Методы расширения. Появилась возможность добавления новых методов в уже существующие классы. Реализуется с помощью ключевого слова this при первом параметре статической функции статического класса.

  • public static class StringExtensions
    {
    public static int ToInt32(this string val)
    {
    return Int32.Parse(val);
    // ...
    string s = "10";
    int x = s.ToInt32();
  • Автоматические свойства: компилятор сгенерирует закрытое (private) поле и соответствующие аксессор и мутатор для кода вида

  • public string Name { get; private set;
    C# 3.0 совместим с C# 2.0 по генерируемому MSIL-коду; улучшения в языке — чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно осуществить, используя безымянные делегаты в сочетании с предикатными методами над контейнерами наподобие List.FindAll и List.RemoveAll.

    Версия 4.0

    Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.
    Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.
    ; Новые возможности в версии 4.0
    • Возможность использования позднего связывания, для использования:
      • с языками с динамической типизацией (Python, Ruby)
      • с COM-объектами
      • отражения (reflection)
      • объектов с изменяемой структурой (DOM). Появляется ключевое слово dynamic.
    • Именованные и опциональные параметры
    • Новые возможности COM interop
    • Ковариантность и контравариантность обобщенных интерфейсов и делегатов
    • Контракты в коде (Code Contracts)
    • Библиотека параллельных задач TPL (Task Parallel Library), концепция задач и классы Task, TaskFactory, Parallel
    • Добавлен класс MemoryCache, который предназначен для кэширования контента. Он похож на класс Cache ASP.NET, но его можно использовать при написании веб- / графических / консольных приложений.
    • Добавлено пространство имен System.Collections.Concurrent и новые классы параллельных коллекций (ConcurrentQueue, ConcurrentStack, ConcurrentBag,…), которые предоставляют не только большую эффективность, но и более полную потокобезопасность.
    Примеры:
    dynamic calc = GetCalculator();
    int sum = calc.Add(10, 20); // Динамический вызов
    public void SomeMethod(int x, int y = 5, int z = 7); // Опциональные параметры

    Версия 5.0

    Новые возможности в версии 5.0
    • Шаблон TAP (Task-based Asynchronous Pattern). TAP использует один метод для представления инициализации и завершения асинхронной операции.
    • Асинхронные методы (async и await) — как реализация шаблона TAP.
    • Сведения о вызывающем объекте

    Версия 6.0

    Новые возможности в версии 6.0
  • null-условные операторы. Добавлены новые операторы: ?. и ?:

  • int? length = customers?.Length; // null if customers is null
    Customer first = customers?0; // null if customers is null
  • Функции сжатые до выражений (expression-bodied functions). Теперь определение метода может быть задано с использованием лямбда-синтаксиса:

  • public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
  • Инициализаторы автосвойств. Автосвойства теперь можно инициализировать при объявлении:

  • public string First { get; set; = "Jane";
  • Автосвойства только для чтения. Автосвойства теперь могут быть объявлены без сеттеров:

  • public string First { get; = "Jane";
  • Инициализаторы индексов. Теперь можно инициализировать не только объекты и коллекции, но и словари:

  • var numbers = new Dictionary {
    7 = "seven",
    9 = "nine",
    13 = "thirteen"
    ;
  • Интерполяция строк. Вместо использования конструкций с String.Format(), например:

  • var s = String.Format("{0 is {1 year old", p.Name, p.Age);
    теперь можно размещать код прямо в строке:
    var s = $"{p.Name is {p.Age year old";
  • Фильтры исключений. Появилась возможность задавать условия для блоков catch:

  • try { … catch (Exception e) when (Log(e)) { …
  • Импорт статических функций типов. Теперь доступ к статическим членам типов возможен без указания полного имени этих членов:

  • using static System.Console;
    using static System.Math;
    class Program
    {
    static void Main()
    {
    WriteLine(Sqrt(3*3 + 4*4));
  • Оператор nameof. Новый оператор, который возвращает компактное строковое представление для переданного в качестве аргумента типа:

  • WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode"
  • Для асинхронного программирования была добавлена возможность использования операторов await внутри блоков catch и finally:

  • Resource res = null;
    try
    {
    res = await Resource.OpenAsync(…); // You could do this.
    catch(ResourceException e)
    {
    await Resource.LogAsync(res, e); // Now you can do this …
    finally
    {
    if (res != null) await res.CloseAsync(); // … and this.

    Версия 7.0

    Новые возможности в версии 7.0
  • out-переменные, которые позволяют объявить переменные сразу в вызове метода (причем областью видимости для таких переменных является внешний блок):
  • p.GetCoordinates(out int x, out int y);
    • Сопоставление с шаблоном. Вводится понятие шаблона (pattern), который представляет собой синтаксическую конструкцию, позволяющую проверить соответствие переменной определённой форме и извлечь из неё информацию.
    • Шаблоны с is (is теперь может использоваться не только с типом, но и с шаблоном — в качестве правого аргумента)
    • Шаблоны и выражение switch. Варианты использования switch были расширены, теперь можно:
      • использовать любые типы (не только примитивные);
      • использовать шаблоны в выражениях case;
      • добавлять дополнительные условия к выражениям case (используя ключевое слово when).
    • Кортежи. Добавлен тип кортеж значений (структура ValueTuple) и синтаксис работы с данными этого типа:
    (string, string, string) LookupName(long id) // возвращаемый тип - кортеж
    {
    ... // инициализируем данные
    return (first, middle, last); // литерал кортежа
    • Распаковка кортежей. Была добавлена новая синтаксическая конструкция деконструктор, позволяющая извлечь кортеж, состоящий из членов класса.
    • Локальные функции. Теперь функцию, которая используется только в теле какого-либо метода, можно объявить прямо в теле этого метода.
    • Улучшения литералов. Были добавлены бинарные литералы и символ разделителя (_) в числовых литералах.
    • Локальные переменные и возвращаемые значения по ссылке. Расширена функциональность ключевого слова ref. Теперь можно возвратить данные из метода или сохранить их в локальной переменной по ссылке.
    • Расширение списка типов, возвращаемых асинхронными методами
    • Больше членов класса в виде выражений. Синтаксис функций, сжатых до выражений (expression-bodied functions), теперь применим для сеттеров, геттеров, конструкторов и деструкторов.
    • throw-выражения. Теперь можно использовать throw в функциях, сжатых до выражений (expression-bodied functions):
    public string GetLastName() => throw new NotImplementedException();

    Версия 8.0

    Новые возможности в версии 8.0
    • Модификатор readonly. Был создан для обозначения члена, который не изменит состояние.
    • Методы интерфейсов по умолчанию. Теперь при создании метода интерфейса можно объявить его реализацию по умолчанию, которую можно переопределить в классе, который реализует этот интерфейс.
    • Сопоставление шаблонов. Возможность позволяет работать с шаблонами в зависимости от формата в связанных, но различных типах данных.
      • Рекурсивные шаблоны. Является выражением шаблона, которое применяется к результатам другого выражения шаблона.
      • Выражения switch позволяют сократить количество case и break, а также фигурных скобок.
    public enum Rainbow
    {
    Red,
    Orange,
    Yellow,
    Green,
    Blue,
    Indigo,
    Violet
    public static RGBColor FromRainbow(Rainbow colorBand) =>
    colorBand switch
    {
    Rainbow.Red => new RGBColor(0xFF, 0x00, 0x00),
    Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
    Rainbow.Yellow => new RGBColor(0xFF, 0xFF, 0x00),
    Rainbow.Green => new RGBColor(0x00, 0xFF, 0x00),
    Rainbow.Blue => new RGBColor(0x00, 0x00, 0xFF),
    Rainbow.Indigo => new RGBColor(0x4B, 0x00, 0x82),
    Rainbow.Violet => new RGBColor(0x94, 0x00, 0xD3),
    _ => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
    ;
    • Шаблоны свойств. Позволяет сопоставлять свойства исследуемого объекта с помощью { variable : value => ... .
    • Шаблоны кортежей. Используется, если нужно работать с несколькими наборами входных данных. (value1, value2,..) => ...
    • Объявление using. Это объявление переменной, которому предшествует ключевое слово using. Оно сообщает компилятору, что объявляемая переменная должна быть удалена в конце области видимости.
    • Статический локальный метод. Теперь можно убедиться в том, что метод не охватывает какие-либо переменные из области видимости с помощью добавления к нему модификатора static.
    • Удаляемые ссылочные структуры. Ссылочные структуры не могут реализовать IDisposable (как и любые другие интерфейсы). Поэтому чтобы удалить ref struct, необходим доступный void Dispose().
    • Ссылочные типы, допускающие значение null. Теперь, чтобы указать, что переменная ссылочного типа допускает значение null, необходимо поставить к имени типа ?
    • Асинхронные потоки. Это во-первых интерфейс IAsyncEnumerable. А во-вторых конструкция foreach с await.
    public static async System.Collections.Generic.IAsyncEnumerable GenerateSequence()
    {
    for (int i = 0; i < 20; i++)
    {
    await Task.Delay(100);
    yield return i;
    // or
    await foreach (var number in GenerateSequence())
    {
    Console.WriteLine(number);
    • Асинхронные высвобождаемые типы. Начиная с C# 8.0 язык поддерживает асинхронные освобождаемые типы, реализующие интерфейс System.IAsyncDisposable. Операнд выражения using может реализовывать IDisposable или IAsyncDisposable. В случае IAsyncDisposable компилятор создает код для await, возвращенного Task из IAsyncDisposable.DisposeAsync.
    • Индексы и диапазоны. Диапазоны и индексы обеспечивают лаконичный синтаксис для доступа к отдельным элементам или диапазонам в последовательности. Нововведение включает в себя операторы ^ и .. , а также System.Index и System.Range
    • Оператор присваивания объединения с null. Оператор ??= можно использовать для присваивания значения правого операнда левому операнду только в том случае, если левый операнд принимает значение null.
    List numbers = null;
    int? i = null;
    numbers ??= new List();
    numbers.Add(i ??= 17);
    numbers.Add(i ??= 20);
    Console.WriteLine(string.Join(" ", numbers)); // output: 17 17
    Console.WriteLine(i); // output: 17
    • Неуправляемые сконструированные типы. Начиная с C# 8.0, сконструированный тип значения является неуправляемым, если он содержит поля исключительно неуправляемых типов (например универсальный тип ).
    • Выражение stackalloc во вложенных выражениях. Теперь если результат выражения stackalloc имеет тип System.Span или System.ReadOnlySpan, то его можно использовать в других выражениях.
    Span numbers = stackalloc { 1, 2, 3, 4, 5, 6 ;
    var ind = numbers.IndexOfAny(stackalloc { 2, 4, 6, 8 );
    Console.WriteLine(ind); // output: 1
  • Порядок маркеров $ и @ в интерполированных строках verbatim теперь может быть любым.
  • Пример «Hello, World!»

    Ниже представлен код классической программы «Hello world» на C# для консольного приложения:
    using System;
    namespace Example
    {
    class Program
    {
    static void Main()
    {
    Console.WriteLine("Hello World!"); // Вывод заданного текста в консоль
    Console.ReadKey(); // Ожидание нажатия клавиши пользователем
    и код этой же программы для приложения Windows Forms:
    // assembly: System.dll
    // assembly: System.Drawing.dll
    // assembly: System.Windows.Forms.dll
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    namespace WindowsForms
    {
    public class Program
    {
    STAThread
    public static void Main()
    {
    new DemoForm().ShowDialog();
    public class DemoForm : Form
    {
    Label label = new Label();
    public DemoForm()
    {
    label.Text = "Hello World!";
    this.Controls.Add(label);
    this.StartPosition = FormStartPosition.CenterScreen;
    this.BackColor = Color.White;
    this.FormBorderStyle = FormBorderStyle.Fixed3D;

    Реализации

    Существует несколько реализаций C#:
    • Реализация C# в виде компилятора csc.exe включена в состав .NET Framework (включая .NET Micro Framework, .NET Compact Framework и его реализации под Silverlight и Windows Phone 7).
    • В составе проекта Rotor (Shared Source Common Language Infrastructure) компании Microsoft.
    • Проект Mono включает в себя реализацию C# с открытым исходным кодом.
    • Проект DotGNU также включает компилятор C# с открытым кодом.
    • DotNetAnywhereDot Net Anywhere — ориентированная на Встраиваемая системавстраиваемые системы реализация CLR, поддерживает практически всю спецификацию C# 2.0.

    См. также


    • Microsoft Visual Studio
    • Mono
    • Сравнение C Sharp и Java
    • Cosmos (операционная система)
    • Vala

    Примечания


    Литература









  • Ссылки

    • Основные материалы по Visual C#
    • Руководство по программированию на C#
    • Язык C# (инструкции по C#)
    • Практическое руководство. Создание приложений Windows Forms на C#
    • Доклад, подробно описывающий новшества в языке С# версии 4.0

    Категория:Семейство языков программирования C Sharp
    Категория:Языки программирования семейства C
    Категория:Языки программирования платформы .NET
    Категория:Языки веб-программирования
    Категория:Языки программирования с автоматическим управлением памятью
    Категория:Высокоуровневые языки программирования
  •  
    Комментарии

    Пока нет комментариев

    последний раз видели
    большинство посещений