C#, string o String?

Quali differenze?

Scritto da Roberto Rossi il 10-2019

C# differenze tra String e string

Allo volte capita che qualcuno ti faccia una domanda apparentemente banale.

Poi, pensandoci un po', ci si rende conte che la domanda non è poi cosi banale e, allo stesso modo, anche la risposta può essere più "impegnativa" del previsto.

La domanda alla quale cercherò di rispondere oggi è:

Nel linguaggio C# che differenza c'è tra i tipi "string" e "String"?

Vediamo...

La risposta facile

"Sono uguali"

Questa, in estrema sintesi, la risposta rapida, la risposta più immediata e semplice che si può dare.

Ma è veramente tutto qui?

In realtà no. Infatti bisognerebbe, prima di tutto, spiegare il come fanno ad essere uguali.

La parole "string" e "String" hanno il medesimo comportamento in quanto la prima è un semplice alias, un semplice "nome alternativo", della seconda.

Andando oltre possiamo dire che "String" sia, in realtà, la classe standard System.String, presente in .NET.

Ma perchè esiste "string"? Non si poteva usare "String"? No.

C# definisce i suoi tipi e sono tutti rappresentati da parole chiave scritte in minuscolo. Coerenza, la coerenza del linguaggio. Facciamo qualche esempio:

  • string = System.String
  • bool = System.Boolean
  • byte = System.Byte
  • sbyte = System.SByte
  • short = System.Int16
  • ushort = System.UInt16
  • int = System.Int32
  • uint = System.UInt32
  • long = System.Int64
  • ulong = System.UInt64
  • float = System.Single
  • ecc...

Quindi, essendo alias sono uguali?

Si, ma a dirla tutta qualche differenza c'è... sottile... ma c'è.

Le differenze

La prima differenza è rappresentata dal fatto che "string" è una parola chiave del linguaggio C# mentre "String" è invece il nome di una classe.

Normalmente questa differenza è trascurabile, ma non proprio sempre.

Una delle caratteristiche principali delle parole chiave è il fatto che non possono essere utilizzate come nomi di variabili.

Chi è quel "creativo" che usa le keywords del linguaggio come variabili? Io non lo so, ma se qualcuno volesse farlo avrebbe dei problemi.

Facciamo un esempio:

char[] String = new char[40];

char[] string = new char[40]; //Error CS0029...

Compilando questo codice ci si accorgerà che tutto va bene usando il nome "String" mentre si avrà un errore sulla seconda linea, quella che utilizza come nome di variabile la parola "string". Come dicevo, le parole chiave del linguaggio non possono essere usate come nomi di variabile.

Ma...

Se io volessi proprio usare come nome "string"? Si, dai, una possibilità c'è, ma solo una.

Si, se proprio desiderassi usare una keyword come nome di variabile potrei farla precedere dal carattere '@', in questo modo:

char[] @string = new char[40];

Cosi si compilerà correttamente.

C'è altro da dire?

Non credo ci sia altro da aggiungere.

Forse, l'unica cosa che si potrebbe dire è mostrare una uguaglianza finale che riassume lo stato di "string" e "String":

typeof(string) == typeof(String) == typeof(System.String)

Questa uguaglianza, in C#, è sempre vera!

Commenti

Per qualsiasi commento o suggerimento puoi scrivermi cliccando in fondo alla pagina sul link di contatto.

Riferimenti