Roadmap per sviluppatori Java che apprendono C#

C# e Java hanno molte analogie. Man mano che si apprende C#, è possibile applicare gran parte delle conoscenze già acquisite dalla programmazione in Java:

  1. Sintassi simile: sia Java che 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 Java 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 in entrambi i linguaggi. I modificatori di accesso da public a private sono gli stessi. Anche molti dei tipi predefiniti usano le stesse parole chiave: int, string e double.
  2. Paradigma orientato agli oggetti: Java e C# sono entrambi linguaggi orientati agli oggetti. I concetti di polimorfismo, astrazione e incapsulamento si applicano in entrambi i linguaggi. In entrambi i linguaggio sono stati aggiunti nuovi costrutti, ma le funzionalità principali sono ancora rilevanti.
  3. Fortemente tipizzati: sia Java che C# sono linguaggi fortemente tipizzati. Si dichiara il tipo di dati delle variabili, in modo esplicito o implicito. Il compilatore applica l'indipendenza dai tipi. Il compilatore rileva gli errori correlati al tipo nel codice prima di eseguirlo.
  4. Multipiattaforma: sia Java che C# sono multipiattaforma. È possibile eseguire gli strumenti di sviluppo nella piattaforma preferita. L'applicazione può essere eseguita su più piattaforme. La piattaforma di sviluppo non deve essere uguale alla piattaforma di destinazione.
  5. Gestione delle eccezioni: sia Java che C# generano eccezioni per indicare gli errori. Entrambi usano blocchi try - catch - finally per gestire le eccezioni. Le classi Exception hanno nomi e gerarchie di ereditarietà simili. Una differenza è che C# non ha il concetto di eccezioni controllate. Qualsiasi metodo potrebbe (in teoria) generare qualsiasi eccezione.
  6. Librerie standard: il runtime .NET e la libreria JSL (Java Standard Library) supportano le attività comuni. Entrambi hanno ecosistemi estesi per altri pacchetti open source. In C# la gestione pacchetti è NuGet. È analogo a Maven.
  7. Garbage Collection: entrambi i linguaggi usano la gestione automatica della memoria tramite Garbage Collection. Il runtime recupera la memoria dagli oggetti a cui non si fa riferimento. Una differenza è che C# consente di creare tipi valore, come i tipi struct.

È possibile diventare produttivi quasi immediatamente in C#, grazie alle analogie. Man mano che si fanno progressi, è opportuno iniziare ad apprendere le funzionalità e gli idiomi in C# che non sono disponibili in Java:

  1. 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'istruzione 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.
  2. 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.
  3. 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. I tipi riferimento che non ammettono i valor Null riducono al minimo gli errori di programmazione che generano System.NullReferenceException.
  4. Metodi di estensione: in C# è possibile creare metodi che estendono una classe o un'interfaccia. I metodi di estensione estendono il comportamento di un tipo da una libreria o tutti i tipi che implementano una determinata interfaccia.
  5. LINQ: LINQ (Language Integrated Query) fornisce una sintassi comune per eseguire query e trasformare i dati, indipendentemente dall'archiviazione.
  6. Funzioni locali: in C#, è possibile annidare funzioni all'interno di metodi o altre funzioni locali. Le funzioni locali forniscono un altro livello di incapsulamento.

Esistono altre funzionalità in C# che non sono disponibili in Java. Si noteranno funzionalità come async e await e le istruzioni using per liberare automaticamente risorse non di memoria.

Esistono anche alcune funzionalità simili tra C# e Java che presentano differenze sottili ma importanti:

  1. Proprietà e indicizzatori: sia le proprietà che gli indicizzatori (per gestire una classe come una matrice o un dizionario) dispongono del supporto del linguaggio. In Java si tratta di convenzioni di denominazione per i metodi che iniziano con get e set.
  2. Record: in C#, i record possono essere tipi class (riferimento) o struct (valore). I record C# possono essere non modificabili, ma non devono essere non modificabili.
  3. Le tuple hanno una sintassi diversa in C# e Java.
  4. Gli attributi sono simili alle annotazioni Java.

Infine, ci sono funzionalità del linguaggio Java che non sono disponibili in C#:

  1. Eccezioni controllate: in C#, qualsiasi metodo potrebbe generare teoricamente qualsiasi eccezione.
  2. Covarianza delle matrici controllata: in C#, le matrici non sono covarianti in modo sicuro. Se sono necessarie strutture covarianti, è consigliabile usare le classi e le interfacce di raccolta generiche.

Nel complesso, l'apprendimento di C# per uno sviluppatore esperto in Java dovrebbe essere agevole. La presenza di svariati idiomi abbastanza familiari permetterà di diventare rapidamente produttivi e sarà possibile imparare le novità velocemente.