Solo per completezza, ecco una discarica di informazioni correlate ...
Come altri hanno notato, string
è un alias per System.String
. Si compilano con lo stesso codice, quindi al momento dell'esecuzione non c'è alcuna differenza. Questo è solo uno degli alias in C #. L'elenco completo è:
object: System.Object
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
double: System.Double
decimal: System.Decimal
char: System.Char
A parte string
e object
, gli alias sono tutti di tipi di valore. decimal
è un tipo di valore, ma non un tipo primitivo nel CLR. L'unico tipo primitivo che non ha un alias è System.IntPtr
.
Nella specifica, gli alias del tipo di valore sono noti come "tipi semplici". I letterali possono essere usati per valori costanti di ogni tipo semplice; nessun altro tipo di valore ha forme letterali disponibili. (Confronta questo con VB, che consente i DateTime
letterali e ha anche un alias per esso.)
V'è una circostanza in cui si deve usare gli alias: quando si specifica in modo esplicito tipo sottostante di un enum. Per esempio:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
Questo è solo un aspetto del modo in cui definisce enum dichiarazioni spec - la parte dopo il colon deve essere l' integrale di tipo di produzione, che è un gettone di sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
... al contrario di un tipo di produzione utilizzato ad esempio da dichiarazioni di variabili. Non indica alcuna altra differenza.
Infine, quando si tratta di quale utilizzare: personalmente uso gli alias ovunque per l'implementazione, ma il tipo CLR per qualsiasi API. In realtà non importa molto quale usi in termini di implementazione: la coerenza tra il tuo team è buona, ma a nessuno importa. D'altra parte, è veramente importante che se si fa riferimento a un tipo in un'API, lo si fa in modo neutrale rispetto al linguaggio. Un metodo chiamato ReadInt32
non è ambiguo, mentre un metodo chiamato ReadInt
richiede interpretazione. Ad esempio, il chiamante potrebbe utilizzare una lingua che definisce un int
alias Int16
. I progettisti di .NET framework hanno seguito questo schema, un buon esempio essendo nelle BitConverter
, BinaryReader
e Convert
classi.
string
è un costrutto lessicale della grammatica C # mentreSystem.String
è solo un tipo. Indipendentemente da qualsiasi differenza esplicita menzionata in qualsiasi specifica, esiste ancora questa differenza implicita che potrebbe essere compensata da una certa ambiguità. Il linguaggio stesso deve supportarestring
in modo tale che l'implementazione non sia (del tutto) così obbligata a prendere in considerazione una determinata classe nel BCL.