Roadmap per sviluppatori JavaScript e TypeScript che apprendono C#

C#, TypeScript e JavaScript sono tutti membri della famiglia di linguaggi C. Le analogie tra i linguaggi consentono di diventare rapidamente produttivi in C#.

  1. Sintassi simile: JavaScript, TypeScript e C# fanno parte della famiglia di linguaggi C. Questa somiglianza significa essere già in grado di leggere e comprendere C#. Esistono alcune differenze, ma la maggior parte della sintassi è identica a JavaScript e C. Le parentesi graffe e i punti e virgola sono familiari. Le istruzioni di controllo come if, else e switch sono le stesse. Le istruzioni di ciclo for, while e do...while sono uguali. Le stesse parole chiave per class e interface esistono sia in C# che in TypeScript. I modificatori di accesso da public a private sono gli stessi In TypeScript e C#.
  2. Il token =>: tutti i linguaggi supportano definizioni di funzioni leggere. In C#, vengono definite espressioni lambda, mentre in JavaScript sono in genere chiamate funzioni freccia.
  3. Gerarchie di funzioni: tutti e tre i linguaggi supportano funzioni locali, che sono funzioni definite in altre funzioni.
  4. Async/Await: tutti e tre i linguaggi condividono le stesse parole chiave async e await per la programmazione asincrona.
  5. Garbage Collection: tutti e tre i linguaggi si affidano a un Garbage Collector per la gestione automatica della memoria.
  6. Modello di eventi: la sintassi event di C# è simile al modello JavaScript per gli eventi DOM (Document Object Model).
  7. Gestione pacchetti: NuGet è la gestione pacchetti più comune per C# e .NET, simile a npm per le applicazioni JavaScript. Le librerie C# vengono distribuite in assembly.

Man mano che si fanno progressi con C#, si apprenderanno i concetti che non fanno parte di JavaScript. Alcuni di questi concetti potrebbero risultare familiari se si usa TypeScript:

  1. Sistema dei tipi C#: C# è un linguaggio fortemente tipizzato. Ogni variabile ha un tipo e tale tipo non può cambiare. Si definiscono tipi class o struct. È possibile specificare definizioni interface che definiscono il comportamento implementato da altri tipi. TypeScript include molti di questi concetti, ma poiché TypeScript è basato su JavaScript, il sistema dei tipi non è così rigoroso.
  2. Criteri di ricerca: i criteri di ricerca consentono di usare istruzioni condizionali ed espressioni concise in base alla forma di strutture di dati complesse. L'espressione is controlla se una variabile "è" un criterio. L'espressione switch basata su criteri fornisce una sintassi avanzata per esaminare una variabile e prendere decisioni in base alle relative caratteristiche.
  3. Interpolazione di stringhe e valori letterali stringa non elaborati: l'interpolazione di stringhe consente di inserire espressioni valutate in una stringa, anziché usare identificatori posizionali. I valori letterali stringa non elaborati consentono di ridurre al minimo le sequenze di escape nel testo.
  4. Tipi che ammettono e non ammettono i valori Null: C# supporta tipi valore che ammettono i valori Nulle tipi riferimento che ammettono i valori Null accodando il suffisso ? a un tipo. Per i tipi che ammettono i valori Null, il compilatore avvisa se non si controlla la presenza di null prima di dereferenziare l'espressione. Per i tipi che non ammettono i valori Null, il compilatore avvisa se si potrebbe assegnare un valore null a tale variabile. Queste funzionalità possono ridurre al minimo la generazione di System.NullReferenceException da parte dell'applicazione. La sintassi potrebbe essere familiare dall'uso di ? in TypeScript per le proprietà facoltative.
  5. LINQ: LINQ (Language Integrated Query) fornisce una sintassi comune per eseguire query e trasformare i dati, indipendentemente dall'archiviazione.

Man mano che si procede con l'apprendimento risulteranno evidenti altre differenze, molte delle quali hanno però un ambito più limitato.

Alcune funzionalità e idiomi familiari di JavaScript e TypeScript non sono disponibili in C#:

  1. Tipi dinamici: C# usa la tipizzazione statica. Una dichiarazione di variabile include il tipo e tale tipo non può cambiare. Esiste un tipo dynamic in C# che fornisce l'associazione in fase di esecuzione.
  2. Ereditarietà prototipale: l'ereditarietà in C# fa parte della dichiarazione del tipo. Una dichiarazione di class in C# indica qualsiasi classe di base. In JavaScript è possibile impostare la proprietà __proto__ per impostare il tipo di base in qualsiasi istanza.
  3. Linguaggio interpretato: è necessario compilare il codice C# prima di eseguirlo. Il codice JavaScript può essere eseguito direttamente nel browser.

Inoltre, alcune altre funzionalità di TypeScript non sono disponibili in C#:

  1. Tipi di unione: C# non supporta i tipi di unione. Tuttavia, esistono proposte di progettazione per questi elementi.
  2. Elementi Decorator: C# non include elementi Decorator. Alcuni elementi Decorator comuni, ad esempio @sealed, sono parole chiave riservate in C#. Altri elementi Decorator comuni possono avere attributi corrispondenti. Per altri elementi Decorator, è possibile creare attributi personalizzati.
  3. Sintassi più libera: il compilatore C# analizza il codice in modo più rigoroso rispetto a quanto richiesto da JavaScript.

Se si sta creando un'applicazione Web, è consigliabile usare Blazor per compilare l'applicazione. Blazor è un framework Web full-stack progettato per .NET e C#. I componenti Blazor possono essere eseguiti nel server, come assembly .NET o nel client tramite WebAssembly. Blazor supporta l'interoperabilità con le librerie JavaScript o TypeScript preferite.