Appunti di C# - Un linguaggio orientato agli oggetti (e al .NET)

1 dic 2014 23.25

_Logo In questa seconda puntata dedicata al C# vedremo velocemente gli aspetti che lo contraddistinguono come un linguaggio orientato agli oggetti, nonché la stretta relazione che ha con il .NET Framework e in particolare con la CLR (il componente del Framework che si occupa di eseguire ciò che è stato scritto in C#).

Partiamo ricordando la massima autorità in materia di C#: le specifiche della corrente versione 5.0 disponibili sul sito microsoft. Per qualsiasi dubbio è un interessante documento di poco più di 500 pagine. In alternativa le pagine MSDN sono altrettanto valide e molto più didattiche, così come i due testi elencati nel primo post di questa serie.

Il C# si definisce orientato agli oggetti perché implementa diversi paradigmi, tra i quali:

  • Inheritance: una classe eredità le caratteristiche della classe padre, caratteristiche che può estendere o ridefinire. In C# una classe può inoltre implementare un’interfaccia, permettendo di tra l’altro di superare la mancanza della multi ereditarietà. Tutti gli oggetti C# derivano inoltre da un unico tipo comune.
  • Abstraction: il processo di modellazione di un oggetto enfatizzando la sua idea astratta, in modo che sia scremato dai dettagli e dalla sua effettiva implementazione. Quindi una realtà complessa può essere semplificata in un modello.
  • Encapsulation: l’implementazione di una classe è nascosta e solo l’interfaccia pubblica è disponibile esternamente.
  • Polymorphism: una certa azione può essere eseguita da oggetti diversi anche con implementazione diverse. Una sorta di astrazione del comportamento.

Non so ancora in quale vita ma penso di scrivere una serie di post anche su questi (bellissimi e fondamentali) concetti: questi e altri legati all’OOP dovrebbero essere chiari a tutti ma in realtà danno vita a diverse interpretazioni e soprattutto a diverse implementazioni

Il C# è un linguaggio fortemente tipizzato (strongly typed language): ad esempio non è possibile chiamare un metodo con argomenti che non sono stati definiti oppure la conversione da un tipo all’altro, quando può comportare degli errori, deve essere esplicita. Tutti questi vincoli permettono al C# di girare in sandbox, in cui è importante garantire che lo stato di un oggetto posso essere corrotto bypassando le regole definite.

Di base il C# è staticamente tipizzato, nel senso che il type safety è forzato al momento della compilazione. In realtà vi sono tecniche per demandare il controllo a runtime, ad esempio utilizzando la parala chiave Dynamic introdotta nella versione 4.0.

Ciò che viene prodotto compilando un sorgente C# è un codice detto gestito (managed code) che viene eseguito da un ambiente di esecuzione virtuale chiamato Common Language Runtime (CLR). La CLR e un insieme di librerie di classi danno vita al .NET Framework.

La CLR è l’implementazione Microsoft dello standard internazionale common language infrastructure (CLI) (standard creato da Microsoft stessa che recentemente ha annunciato importanti novità per il suo Framework garantendo in un prossimo futuro un porting ufficiale su diverse piattaforme).

Tra l’altro curiosando nei meandri del C# e del .NET ho scoperto che l’elenco dei linguaggio CLI è più lungo di quanto mi aspettassi: C#, VB.NET, PowerShell, F# e pochi altri non sono una sorpresa di certo, ma ve ne sono poi ancora una dozzina…

Tecnicamente il C# è indipendente dalla CLR, ma essendo cresciuti assieme da mamma Microsoft, C# e CLR sono intimamente legati: ad esempio la gestione della memoria è un compito della CLR. La CLR inoltre fa parte del .NET Framework assieme a moltissime altre librerie (circa 4000 classi in continuo aumento che supportano lo sviluppatore dalla lettura di un file alla creazione di interfacce utente). Tra gli altri compiti della CLR vi sono la sicurezza, il caricamento degli assembly, la gestione dei thread, il type safety, il debugging, l’interazione COMe il fornitore la libreria di classi base.

Il C# si è evoluto del tempo e questo schema ne riporta le principali novità fin dalla prima versione:

C# Versions

Ciò che rende il C# un linguaggio all’avanguardia è la sua semplicità ed eleganza nonostante sia un linguaggio molto versatile. Tra le molte caratteristiche vincenti cito le espressioni lambda, i delegati, i metodi e i tipi generici, gli iteratori e LINQ. Inoltre, grazie al concetto di Interop e all’accesso diretto alla memoria tramite blocchi unsafe può sfruttare tutte le risorse del sistema alla pari di linguaggi nativi come il C++. Tutti argomenti che affronteremo nelle prossime puntate.

Tag: C#, OOP, .NET