Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Язык C# является самым популярным языком для платформы .NET, бесплатной кроссплатформенной среды разработки открытый код. Программы C# могут выполняться на различных устройствах, от устройств Интернета вещей (IoT) до облака и между ними. Вы можете создавать приложения для телефонных, настольных и ноутбуков и серверов.
C# — это кроссплатформенный язык общего назначения, который делает разработчиков продуктивным при написании высокопроизводительного кода. С миллионами разработчиков C# является самым популярным языком .NET. C# имеет широкую поддержку в экосистеме и для всех рабочих нагрузок .NET. Основанный на объектно-ориентированных принципах, он включает множество функций из других парадигм, включая функциональное программирование. Низкоуровневые функции поддерживают сценарии высокой эффективности без написания небезопасного кода. Большая часть среды выполнения и библиотек .NET написана на C#, и прогресс в C# часто используется для всех разработчиков .NET.
C# находится в семействе языков C.
Синтаксис C# знаком, если вы использовали C, C++, JavaScript, TypeScript или Java. Как и C++, запятая двоеточие (;
) определяет конец инструкций. Идентификаторы C# чувствительны к регистру. C# имеет такое же использование фигурных скобок, {
как и операторов управления потоком, таких как }
, if
и else
, а также конструкции для циклов, такие как switch
, for
и while
. C# также имеет инструкцию foreach
для любого типа коллекции.
Hello World
Для первого знакомства с языком программирования традиционно используется программа "Hello, World". Вот это на C#:
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
Строка, начатая с //
, это однострочный комментарий. Одиночные строковые комментарии C# начинаются с //
и продолжаются до конца текущей строки. C# также поддерживает многострочные комментарии. Многострочные комментарии начинаются с /*
и заканчиваются */
. Метод WriteLine
класса Console
, находящегося в пространстве имен System
, создает выходные данные программы. Этот класс предоставляется стандартными библиотеками классов, которые по умолчанию автоматически ссылаются в каждой программе C#. Для другой формы программы необходимо объявить содержащий класс и метод для точки входа программы. Компилятор синтезирует эти элементы при использовании инструкций верхнего уровня.
Этот альтернативный формат по-прежнему действителен и содержит многие основные понятия во всех программах C#. Многие существующие примеры C# используют следующий эквивалентный формат:
using System;
using TourOfCsharp;
class Program
{
static void Main()
{
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
}
}
Предыдущая программа Hello, World начинается с using
директивы, которая ссылается на System
пространство имен. Пространства имен позволяют иерархически упорядочивать программы и библиотеки C#. Пространства имен содержат типы и другие пространства имен, например System
пространство имен содержит множество типов, таких как Console
класс, на который ссылается программа, и многие другие пространства имен, IO
например и Collections
. Директива using
, которая ссылается на пространство имен, позволяет использовать типы из этого пространства имен без указания полного имени. Благодаря директиве using
в коде программы можно использовать сокращенное имя Console.WriteLine
вместо полного варианта System.Console.WriteLine
. В предыдущем примере это пространство имен было неявно включено.
Класс Program
, объявленный в программе "Hello, World", имеет только один член — это метод с именем Main
. Метод Main
объявлен с модификатором static
. Методы экземпляра могут ссылаться на конкретный экземпляр объекта, используя ключевое слово this
, в то время как статические методы функционируют без ссылки на конкретный объект. По соглашению, если отсутствуют операторы верхнего уровня, статический метод с именем Main
служит точкой входа программы C#. Класс, Main
содержащий метод, обычно называется Program
.
Совет
Примеры, приведенные в этой статье, дают вам первый взгляд на код C#. Некоторые примеры могут отображать элементы C#, с которыми вы не знакомы. Когда вы будете готовы узнать C#, начните с наших начальных руководств или ознакомьтесь со ссылками в каждом разделе. Если у вас есть опыт работы с Java, JavaScript, TypeScript или Python, ознакомьтесь с нашими советами, чтобы помочь вам найти сведения, необходимые для быстрого изучения C#.
Знакомые функции C#
C# подходит для начинающих, но предлагает расширенные возможности для опытных разработчиков написания специализированных приложений. Вы можете быстро стать продуктивными. Вы можете узнать больше специализированных методов, так как они нужны для ваших приложений.
Приложения C# получают преимущества автоматического управления памятью среды выполнения .NET. Приложения C# также используют обширные библиотеки среды выполнения, предоставляемые пакетом SDK для .NET. Некоторые компоненты являются независимыми от платформы, такими как библиотеки файловой системы, коллекции данных и математические библиотеки. Другие относятся к одной рабочей нагрузке, например к веб-библиотекам ASP.NET Core или библиотеке пользовательского интерфейса .NET MAUI. Многофункциональная экосистема Open Source в NuGet расширяет библиотеки, которые являются частью среды выполнения. Эти библиотеки предоставляют еще больше компонентов, которые можно использовать.
C# — это строго типизированный язык. Каждая объявленная переменная имеет тип, известный во время компиляции. Компилятор или средства редактирования сообщают вам, используется ли этот тип неправильно. Эти ошибки можно исправить, прежде чем вы когда-либо запускаете программу.
Основные типы данных встроены в язык и среду выполнения: такие типы значений, как , int
double
ссылочные типы, такие как char
string
массивы и другие коллекции. При написании программ вы создаете собственные типы. Эти типы могут быть struct
типами значений или class
типами, определяющими объектно-ориентированное поведение. Можно добавить модификатор record
к типу struct
или class
, чтобы компилятор синтезировал код для сравнения равенства. Можно также создавать interface
определения, определяющие контракт или набор элементов, которые должны предоставлять тип, реализующий этот интерфейс. Вы также можете определить универсальные типы и методы.
Обобщения используют параметры типа чтобы заменить фактический тип при использовании.
При написании кода вы определяете функции, также называемые методами, как элементы типов struct
и class
. Эти методы определяют поведение ваших типов. Методы могут быть перегружены с разными числами или типами параметров. Методы могут при необходимости возвращать значение. Помимо методов, типы C# могут иметь свойства, которые являются элементами данных, поддерживаемыми функциями, называемыми аксессорами. Типы C# могут определять события, позволяющие типу уведомлять подписчиков о важных действиях. C# поддерживает объектно-ориентированные методы, такие как наследование и полиморфизм для class
типов.
Приложения C# используют исключения для создания отчетов и обработки ошибок. Эта практика знакома, если вы использовали C++ или Java. Код создает исключение, если оно не может сделать то, что было предназначено. Другой код, независимо от количества уровней стека вызовов, может при необходимости восстановиться с помощью try
- catch
блока.
Отличительные возможности C#
Некоторые элементы C# могут быть менее знакомы.
C# предоставляет сопоставление шаблонов. Эти выражения позволяют проверять данные и принимать решения на основе его характеристик. Сопоставление шаблонов обеспечивает отличный синтаксис для потока управления на основе данных. В следующем коде показано, как можно выразить методы для логических операций AND, OR и XOR с помощью синтаксиса сопоставления шаблонов.
public static bool Or(bool left, bool right) =>
(left, right) switch
{
(true, true) => true,
(true, false) => true,
(false, true) => true,
(false, false) => false,
};
public static bool And(bool left, bool right) =>
(left, right) switch
{
(true, true) => true,
(true, false) => false,
(false, true) => false,
(false, false) => false,
};
public static bool Xor(bool left, bool right) =>
(left, right) switch
{
(true, true) => false,
(true, false) => true,
(false, true) => true,
(false, false) => false,
};
Выражения сопоставления шаблонов можно упростить с помощью _
в качестве универсального шаблона для любого значения. В следующем примере показано, как упростить и метод.
public static bool ReducedAnd(bool left, bool right) =>
(left, right) switch
{
(true, true) => true,
(_, _) => false,
};
В предыдущих примерах также объявляют кортежи, упрощенные структуры данных.
Кортеж — это упорядоченная последовательность значений фиксированной длины, которая может иметь необязательные имена и отдельные типы. Заключите последовательность в символы (
и )
. Объявление определяет кортеж (left, right)
с двумя логическими значениями: left
и right
. Каждая рукоятка переключателя объявляет значение кортежа, например (true, true)
. Кортежи предоставляют удобный синтаксис для объявления одного значения с несколькими значениями.
Выражения коллекции предоставляют общий синтаксис для предоставления значений коллекции. Вы пишете значения или выражения между символами [
и ]
, и компилятор преобразует это выражение в требуемый тип коллекции.
int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<string> names = ["Alice", "Bob", "Charlie", "David"];
IEnumerable<int> moreNumbers = [.. numbers, 11, 12, 13];
IEnumerable<string> empty = [];
В предыдущем примере показаны различные типы коллекций, которые можно инициализировать с помощью выражений коллекции. В одном примере используется пустое []
выражение коллекции для объявления пустой коллекции. Другой пример использует ..
элемент spread для расширения коллекции и добавления всех его значений в выражение коллекции.
Выражения индекса и диапазона можно использовать для получения одного или нескольких элементов из индексируемой коллекции:
string second = names[1]; // 0-based index
string last = names[^1]; // ^1 is the last element
int[] smallNumbers = numbers[0..5]; // 0 to 4
Индекс ^
указывает с конца , а не с начала. Элемент ^0
размещён за пределами конца коллекции, таким образом, ^1
является последним элементом. В ..
выражении диапазона обозначается диапазон элементов, которые необходимо включить. Диапазон начинается с первого индекса и включает все элементы до, но не включая элемент в последнем индексе.
Языковой интегрированный запрос (LINQ) предоставляет общий синтаксис на основе шаблонов для запроса или преобразования любой коллекции данных. LINQ унифицировывает синтаксис для запроса коллекций в памяти, структурированных данных, таких как XML или JSON, хранилище баз данных и даже облачные API данных. Вы узнаете один набор синтаксиса, и вы можете искать и управлять данными независимо от его хранилища. Следующий запрос находит всех учащихся, средний показатель которого превышает 3,5:
var honorRoll = from student in Students
where student.GPA > 3.5
select student;
Предыдущий запрос работает для многих типов хранилища, представленных с помощью Students
. Это может быть коллекция объектов, таблица базы данных, большой двоичный объект облачного хранилища или структура XML. Один и тот же синтаксис запроса работает для всех типов хранилища.
Модель асинхронного программирования на основе задач позволяет писать код, который считывается как будто он выполняется синхронно, даже если он выполняется асинхронно. Он использует ключевые слова async
и await
для описания методов, которые являются асинхронными, и когда выражение вычисляется асинхронно. В следующем примере ожидается асинхронный веб-запрос. После завершения асинхронной операции метод возвращает длину ответа:
public static async Task<int> GetPageLengthAsync(string endpoint)
{
var client = new HttpClient();
var uri = new Uri(endpoint);
byte[] content = await client.GetByteArrayAsync(uri);
return content.Length;
}
C# также поддерживает await foreach
инструкцию для итерации коллекции, поддерживаемой асинхронной операцией, например API разбиения по страницам GraphQL. Следующий пример считывает данные порциями, возвращая итератор, который предоставляет доступ к каждому элементу, когда он становится доступен.
public static async IAsyncEnumerable<int> ReadSequence()
{
int index = 0;
while (index < 100)
{
int[] nextChunk = await GetNextChunk(index);
if (nextChunk.Length == 0)
{
yield break;
}
foreach (var item in nextChunk)
{
yield return item;
}
index++;
}
}
Вызывающие могут итерировать коллекцию с помощью инструкции await foreach
.
await foreach (var number in ReadSequence())
{
Console.WriteLine(number);
}
Наконец, в рамках экосистемы .NET можно использовать Visual Studio или Visual Studio Code с C# DevKit. Эти средства предоставляют полное представление о C#, включая код, который вы пишете. Они также предоставляют возможности отладки.