Corso C# 8 (da zero) ITA Win/Mac/Linux - #05: tipo char, così piccolo così complesso - prima parte

Full Transcript — Download SRT & Markdown

00:00
Speaker 1
Un paio di informazioni di servizio prima di continuare. La prima, mi avevate chiesto se non era possibile attivare gli stessi analizzatori di codice già visti per Visual Studio anche per il Visual Studio Code.
00:11
Speaker 1
Beh, la risposta è sì, ce l'avete già nel plugin che vi ho fatto installare l'altra volta, e cioè il C# for Visual Studio, questo, Code, basato su OmniSharp.
00:26
Speaker 1
È già quest'ultimo che include quegli analizzatori di codice.
00:30
Speaker 1
Ma non solo attivati, al limite, e come si fa? Qui nelle estensioni, andate sulla rotellina in corrispondenza del plugin, Extension Settings.
00:40
Speaker 1
E andate ad assicurarvi che ci sia la spunta vicino alla voce, questa qua, OmniSharp, Enable Roslyn, che è il compilatore utilizzato da Visual Studio.
00:51
Speaker 1
Non è attivo di default perché è in stato ancora parzialmente sperimentale, ma secondo me funziona già abbastanza bene.
01:01
Speaker 1
Condivido sempre prendendo dai vostri post, ringraziamo Paolo Russo che ci segnala un paio di estensioni piuttosto potenti per l'analisi e scrittura del codice.
01:40
Speaker 1
Una è questo Visual Assist della Whole Tomato.
01:58
Speaker 1
E questo Supercharger. Io non li ho provati personalmente, quindi ci stiamo fidando di Paolo Russo.
02:12
Speaker 1
Verificate magari prima che non ci siano incompatibilità nelle descrizioni e cose di questo tipo.
02:18
Speaker 1
Sono entrambi estensioni per Visual Studio, poi non so se vi sia il corrispondente per il Visual Studio Code. Entriamo allora nel vivo di questa puntata.
02:36
Speaker 1
In quella precedente abbiamo introdotto per i tipi principali, char, string, numeri interi e floating point e booleani, le costanti letterali.
02:52
Speaker 1
Che sono il modo più semplice di introdurre valori di quei tipi all'interno del codice. Da oggi riprenderemo uno dopo l'altro tutti questi tipi in dettaglio.
03:16
Speaker 1
E preferisco iniziare un nuovo progetto, sempre .NET Core, che chiamiamo tipo char, tipo_char_video5.
03:34
Speaker 1
Char, così piccolo e così ricco di particolari. Ad esempio, una cosa che lascia un dubbio spesso ai neofiti.
03:44
Speaker 1
Ma perché ce n'è bisogno? Abbiamo visto che esiste già la possibilità di introdurre delle stringhe in questo modo, e questo allora un carattere.
04:02
Speaker 1
Perché c'è bisogno di un tipo specifico per indicare quella che apparentemente è la stessa cosa?
04:11
Speaker 1
E cioè questo. Le stringhe, vi ricordo, sono delimitate dalle virgolette, i char, i singoli caratteri, invece dagli apici.
04:24
Speaker 1
Per una motivazione completa dovrei introdurre tecnicismi che sono troppo per il livello, almeno quello iniziale sicuramente della playlist.
05:05
Speaker 1
Per cui dovrete accontentarvi di un'approssimazione, di una spiegazione intuitiva. Le stringhe, che possono contenere anche migliaia di caratteri, sono molto più flessibili nella programmazione dei semplici char.
05:44
Speaker 1
Tranne molto, vedremo infatti che dispongono di comandi per concatenarsi tra di loro, a formare stringhe più lunghe, potremmo sapere di quanti caratteri sono formate.
06:06
Speaker 1
Potremmo accedere ai singoli caratteri se necessario, avremo comandi per eliminare gli spazi in testa, in coda, inutili, trasformarli in maiuscolo, in minuscolo e tante altre cose.
06:23
Speaker 1
Questa flessibilità, è intuitivo, comporta una complessità interna della classe string piuttosto elevata. La classe char e i suoi oggetti letterali sono più snelli e quindi fanno pagare un prezzo minore per servizi di cui non si ha bisogno.
06:51
Speaker 1
Io sono convinto che sapere, almeno a livello approssimativo, come ciascun tipo di dato viene rappresentato internamente nella memoria del PC, aiuta molto a capire poi quello che si può fare e al supporto che ci si può aspettare lavorando con ciascuno dei tipi disponibili.
07:26
Speaker 1
Senza questi dettagli che sto per introdurre, ad esempio, un programmatore proveniente dal mondo C C++ potrebbe non cogliere o addirittura non capire il perché il tipo char in C# occupa 16 bit.
08:00
Speaker 1
Mentre da sempre c'è questa equazione, che poi a volte è fallata, in C e C++, char uguale sempre un byte, 8 bit.
08:18
Speaker 1
È fallata perché su alcune piattaforme hardware abbiamo che il byte non è di 8 bit, ma per dire di 7 o di 4.
08:32
Speaker 1
Come penso molti di voi sapranno, la prima tabella di codifica dei caratteri, una delle più diffuse, quantomeno, è l'ASCII e usava soltanto 7 bit su 8 per motivi che adesso qui non sto ad approfondire.
09:10
Speaker 1
In tempi piuttosto brevi, però, l'ottavo bit fu utilizzato per estendere la capacità di rappresentazione di questa tabella fino a 256 simboli, e ciascuno di questi, quindi, ha bisogno solo di un byte per essere codificato.
09:38
Speaker 1
Ma l'esplosione dell'informatica ha reso insufficiente anche questo schema. Siamo maturi per l'introduzione di tabelle ancora più grandi.
10:13
Speaker 1
L'Unicode, nella sua prima versione, prevedeva la possibilità di differenziare tra 65.536 simboli, siamo intorno al 1995, coevi con la nascita di Windows.
10:40
Speaker 1
Ecco spiegato l'arcano. I progettisti, gli architetti software di Windows, scelsero quello che al momento sembrava lo schema più furbo di rappresentare internamente la RAM per Windows, intendo, i caratteri.
11:10
Speaker 1
Uno schema 16 bit che ricalcava i 16 bit dell'Unicode di quei tempi. Ed è così anche oggi.
11:30
Speaker 1
Windows internamente rappresenta i simboli del nostro alfabeto con una codifica 16 bit. Questa codifica ha un nome internazionalmente noto e internazionalmente adottato dagli organismi internazionali.
11:50
Speaker 1
Eh, per fortuna non ne sta usando uno tutto suo.
12:00
Speaker 1
Lo schema è chiamato codifica UTF-16.
12:10
Speaker 1
Infatti, quando si sta per introdurre, ne parleremo tra poco, una variabile, cioè un contenitore per valori di tipo char, con C#, il pop-up d'aiuto che otteniamo come descrizione di quel tipo di identificatore dice System.Char.
12:40
Speaker 1
E sotto, la parte bianca è importante.
12:50
Speaker 1
Rappresenta un carattere come un code unit UTF-16.
13:00
Speaker 1
Occhio però, questo non vuol dire che tutti i caratteri saranno sempre e solo rappresentati utilizzando 16 bit.
13:20
Speaker 1
Perché la questione, la faccenda è un po' più complicata di quello che sembra.
13:30
Speaker 1
Vediamo perché. Premesso che poi a tutti gli effetti ce ne fregheremo e lavoreremo semplicemente come se fosse sempre così.
13:40
Speaker 1
L'Unicode si è ulteriormente espanso, la tabella è diventata mostruosa, è suddivisa in plan, sono 17 plan, e vedete lì sulla sinistra, impilati uno sotto l'altro.
14:10
Speaker 1
Ciascuno contiene 65.536 caratteri.
14:20
Speaker 1
In tutto, fate i conti, fanno 1.114.112 simboli.
14:30
Speaker 1
Finalmente tutti gli alfabeti del mondo, delle lingue presenti, ma anche passate, lingue antiche.
14:40
Speaker 1
Ah, qui neanche 16 bit bastano più, non tanti di più, eh, a livello teorico, ne basterebbero 21, 20 e rotti per chi mastica un po' di binario.
15:00
Speaker 1
Il che però porta a 24, perché non si può andare se non a multipli di 8, 3 byte. Questo, se adottassimo, sarebbe molto sconveniente, ora vi dico semplicemente anche il perché.
15:20
Speaker 1
Una codifica a lunghezza fissa, cioè, immaginate di poter indicare uno qualunque di questi, un milione e rotti di simboli, per cui in RAM, ma anche su disco, utilizzare anche per le vecchie nostre letterine della tabella ASCII, 3 byte.
15:40
Speaker 1
Una tragedia, perché d'un botto avremmo triplicato lo spazio occupato sui dischi. E tragedia della tragedia, d'un botto aver reso incompatibili tutti gli applicativi con gli schemi di salvataggio dei dati.
16:00
Speaker 1
Sono stati allora inventati degli ingegnosi sistemi di codifica che alla base hanno ancora l'Unicode, ma che non l'utilizzo permettono un bel risparmio.
16:20
Speaker 1
I due più diffusi sono l'UTF-8 e l'UTF-16.
16:30
Speaker 1
Sì, quello visto prima in Visual Studio.
16:40
Speaker 1
L'idea di base è quella di utilizzare meno byte per i simboli più comuni. Ad esempio, l'UTF-8 utilizza un solo byte per tutti quei simboli che già erano presenti nella tabella ASCII.
17:00
Speaker 1
Molto conveniente e non rompe neppure la compatibilità con i vecchi software, provate a pensare se d'un botto tutti i software che utilizzavano un file di testo, passando all'Unicode, dovessero essere riscritti per adattarsi.
17:20
Speaker 1
Eh, costosissimo.
17:30
Speaker 1
Non sorprende allora che l'UTF-8, per quanto riguarda la memorizzazione su disco e anche lo scambio delle pagine web, eh, guardate nell'intestazione HTML, spesso c'è quel UTF-8.
17:50
Speaker 1
Sia stato universalmente, dicevo, adottato.
18:00
Speaker 1
Per i simboli un po' meno comuni si utilizzano due byte con UTF-8, per quelli ancora meno comuni tre, per quelli più rari quattro byte.
18:20
Speaker 1
Uno in più, quindi, di quelli teoricamente necessari, ma è il prezzo che si paga per avere la codifica variabile, perché alcuni bit, quelli che avete lì in rosso, servono a far capire a chi legge il documento se è iniziata una sequenza da un byte, due byte o tre byte.
18:40
Speaker 1
Poi c'è l'UTF-16, la scelta qua è diversa, di usare fin da subito, come primo step, due byte, e quindi avere da subito la possibilità di agganciare 65.536 simboli.
19:00
Speaker 1
Ma a volte potrebbero servirne di più.
19:10
Speaker 1
E allora ecco che andremo ad aggiungere altri 16 bit.
19:20
Speaker 1
Per cui una codifica UTF-16 può utilizzare o due byte, quando è sufficiente, o quattro.
19:30
Speaker 1
UTF-8 e UTF-16 coesistono, hanno vantaggi e svantaggi.
19:40
Speaker 1
E come dicevo, il .NET adotta come formato interno per il tipo char, la classe char, proprio l'UTF-16. E tornando a Visual Studio, ci accorgiamo di questa non ingombrante presenza dell'UTF-16.
20:00
Speaker 1
Oltre che in quei piccoli box descrittivi, dal fatto che, se serve, abbiamo davvero la possibilità di inserire nel nostro codice codifiche UTF-16.
20:20
Speaker 1
Ovvio che non lo facciamo per le normali lettere dell'alfabeto, punteggiatura, sarebbe ridicolo. Lo faremmo per simboli, diciamo, speciali, non so, anche le smile, le faccine e altri simboli grafici.
20:40
Speaker 1
Però, lavorando a console, come stiamo facendo adesso, non è possibile sperimentare come potremmo fare invece col JavaScript in un browser, perché le capacità di rappresentazione in output della console sono abbastanza limitate.
21:00
Speaker 1
Per cui si va a lavorare sostanzialmente con la vecchia tabella ASCII, lavorando a console. Sì, qualcosa di più potremmo fare passando per l'UTF-8, impostando la console in modalità UTF-8 e utilizzando quei codici.
21:20
Speaker 1
Però, insomma, sarebbe esagerato, fermiamoci pure qui.
21:30
Speaker 1
Comunque, questa è la codifica della lettera A maiuscola.
21:40
Speaker 1
Dovete leggere il tutto in esadecimale, la U sta per UTF Unicode.
21:50
Speaker 1
41 è 65, che è il codice ASCII della vecchia tabella della A maiuscola.
22:00
Speaker 1
Eccola qui. Ora, come dicevo, ci dimentichiamo di questa cosa.
22:10
Speaker 1
E vi propongo una piccola situazione banale, ma che ci mette in crisi, perché ci fa capire che ci mancano gli strumenti per poter procedere.
22:30
Speaker 1
E ce ne occuperemo, ovviamente, nel prossimo video.
22:40
Speaker 1
Eccoci qua. Immaginiamo che l'utente abbia comandato in qualche modo la cancellazione di un dato.
22:50
Speaker 1
Un record di un cliente, quello che volete.
23:00
Speaker 1
E noi, per sicurezza, si voglia chiedere conferma.
23:10
Speaker 1
Quindi possiamo tranquillamente stampare il titolo di un menù, poi le due opzioni che diamo all'utente.
23:30
Speaker 1
Premi la C se vuoi confermare e premi A se vuoi annullare.
23:40
Speaker 1
E poi, come conferma, hai scelto, e vabbè, poi procedere.
23:50
Speaker 1
Eh, già, ma dov'è che lo mettiamo questo tasto?
24:00
Speaker 1
Non possiamo saperlo ora quello che sceglierà, magari tra un mese, un qualunque utente.
24:20
Speaker 1
Scopriamo di aver bisogno, al di là di queste costanti letterali, di un qualche contenitore per depositarci dentro valori del tipo che ci serve.
24:40
Speaker 1
E poter recuperare gli stessi valori per i calcoli successivi.
24:50
Speaker 1
Stiamo chiedendo a gran voce quel che in informatica, nella programmazione in particolare, prende il nome di variabile.
25:10
Speaker 1
A risentirci.

Get More with the Söz AI App

Transcribe recordings, audio files, and YouTube videos — with AI summaries, speaker detection, and unlimited transcriptions.

Or transcribe another YouTube video here →