Поделиться через


Дорожная карта для разработчиков JavaScript и TypeScript, изучающих C#

Если вы присоединяетесь к команде, которая использует C#, или изучаете его для разработки серверной или полного стека, эта статья поможет вам быстро начать работать эффективно. Он выделяет знакомые возможности JavaScript и TypeScript и новые возможности C#.

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

  1. Аналогичный синтаксис: JavaScript, TypeScript и C# находятся в семействе языков C. Это сходство означает, что вы уже можете читать и понимать C#. Существуют некоторые различия, но большая часть синтаксиса совпадает с JavaScript и C. Фигурные скобки и точка с запятой знакомы. Операторы управления, такие как if, elseи switch одинаковы. Операторы циклов for, while и do...while одинаковы. Одни и те же ключевые слова для class и interface находятся как в C#, так и в TypeScript. Модификаторы доступа в TypeScript и C#, от public до private, одинаковы.
  2. Маркер =>: все языки поддерживают облегченные определения функций. В C#они называются лямбда-выражениями. В JavaScript они обычно называются функциями со стрелками.
  3. иерархии функций: все три языка поддерживают локальные функции, которые являются функциями, определенными в других функциях.
  4. Async / Await: все три языка используют одинаковые async и ключевые слова await для асинхронного программирования.
  5. сборка мусора: все три языка основаны на сборщике мусора для автоматического управления памятью.
  6. модель событий: синтаксис event C#аналогичен модели JavaScript для событий объектной модели документа (DOM).
  7. Диспетчер пакетов: NuGet — это наиболее распространенный диспетчер пакетов для C#, аналогичный npm для приложений JavaScript. Библиотеки C# предоставляются в сборках.

Синтаксис на первый взгляд

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

Заметки типа:

// TypeScript
let name: string = "Hello";
let count: number = 5;
// C#
string name = "Hello";
int count = 5;

Async / await:

// TypeScript
async function fetchData(): Promise<string> {
    const response = await fetch(url);
    return await response.text();
}
// C#
async Task<string> FetchDataAsync() {
    var response = await client.GetAsync(url);
    return await response.Content.ReadAsStringAsync();
}

Дополнительные сведения см. в статье "Асинхронное программирование".

Классы:

// TypeScript
class Point {
    constructor(public x: number, public y: number) {}
}
// C#
record Point(int X, int Y);

Дополнительные сведения см. в разделе "Записи".

Сопоставление с шаблоном:

// TypeScript - manual type checking
if (typeof value === "string") { /* ... */ }
// C# - pattern matching
if (value is string s) { /* use s */ }

Дополнительные сведения см. в разделе "Сопоставление шаблонов".

Новые возможности для вас в C#

По мере изучения C#вы сталкиваетесь с понятиями, которые не являются частью JavaScript. Некоторые из этих понятий могут быть знакомы с вами, если вы используете TypeScript:

  1. система типов C#: C# — строго типизированный язык. Каждая переменная имеет тип, и этот тип не может измениться. Вы определяете типы class или struct. Вы можете определить определения interface, определяющие поведение, реализованное другими типами. TypeScript включает многие из этих понятий, но так как TypeScript построен на JavaScript, система типов не так строга.
  2. шаблонное сопоставление: шаблонное сопоставление позволяет создавать лаконичные условные операторы и выражения, основанные на форме сложных структур данных. Выражение is проверяет, соответствует ли переменная какому-либо шаблону. Выражение на основе шаблона switch предоставляет широкий синтаксис для проверки переменной и принятия решений на основе его характеристик.
  3. интерполяция строк и необработанные строковые литералы: интерполяция строк позволяет вставлять вычислянные выражения в строку, а не использовать позиционные идентификаторы. Сырьевые строковые литералы позволяют уменьшить необходимость в escape-последовательностях в тексте.
  4. Типы, допускающие значение NULL и не допускающие значение NULL: C# поддерживает типы значений, допускающие значение NULL, и ссылочные типы, допускающие значение NULL , путем ? добавления суффикса к типу. Для типов с возможностью значения NULL компилятор предупреждает вас, если вы не проверяете наличие null перед разыменованием выражения. Для типов, не допускающих значение NULL, компилятор предупреждает вас, если вы можете присвоить значение null этой переменной. Эти функции могут свести к минимуму возникновение System.NullReferenceExceptionв вашем приложении. Синтаксис может быть знаком благодаря использованию примера ? в TypeScript для необязательных свойств.
  5. LINQ: языковой интегрированный запрос (LINQ) предоставляет общий синтаксис для запроса и преобразования данных независимо от его хранилища.

Подсказка

Дополнительные сведения о системе типов C#, включая class и struct, универсальные шаблоны и интерфейсы, см. в разделе Обзор системы типов в разделе "Основы".

Когда вы узнаете больше, другие различия становятся очевидными, но многие из этих различий меньше по масштабу.

Некоторые знакомые функции и идиомы из JavaScript и TypeScript недоступны в C#:

  1. динамических типов: C# использует статическую типизацию. Объявление переменной включает тип, и этот тип не может измениться. В C# есть тип dynamic, который предоставляет привязку среды выполнения.
  2. прототипное наследование: наследование C# является частью объявления типа. Объявление C# class указывает любой базовый класс. В JavaScript свойство __proto__ задается для установки базового типа на любом экземпляре.
  3. интерпретируемый язык: код C# необходимо скомпилировать перед его запуском. Код JavaScript можно запускать непосредственно в браузере.

Кроме того, несколько дополнительных функций TypeScript недоступны в C#:

  1. Типы союзов: начиная с C# 15, C# поддерживает типы союзов. Объединение определяет замкнутый набор именованных вариантов, которые может представлять значение, и компилятор гарантирует исчерпывающее сопоставление с использованием шаблонов по этим вариантам.
  2. декораторы: C# не имеет декораторов. Некоторые распространенные декораторы, такие как @sealed, являются зарезервированными ключевыми словами в C#. Другие распространенные декораторы могут иметь соответствующие атрибуты. Для всех остальных декораторов вы можете создать собственные атрибуты.
  3. более простительный синтаксис: компилятор C# анализирует код более строго, чем требует JavaScript.

Если вы создаете веб-приложение, попробуйте использовать Blazor для создания приложения. Blazor — это веб-платформа с полным стеком, созданная для C#. Компоненты Blazor могут выполняться на сервере, как сборки .NET или на клиенте с помощью WebAssembly. Blazor поддерживает взаимодействие с любимыми библиотеками JavaScript или TypeScript.

Дальнейшие шаги