Juste pour être complet, voici une décharge de cerveau d'informations connexes ...
Comme d'autres l'ont noté, string
est un alias pour System.String
. Ils compilent dans le même code, donc au moment de l'exécution, il n'y a aucune différence. Ce n'est qu'un des alias en C #. La liste complète est:
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
Mis à part string
et object
, les alias sont tous des types de valeur. decimal
est un type de valeur, mais pas un type primitif dans le CLR. Le seul type primitif qui n'a pas d'alias est System.IntPtr
.
Dans la spécification, les alias de type valeur sont appelés «types simples». Les littéraux peuvent être utilisés pour des valeurs constantes de chaque type simple; aucun autre type de valeur n'a de formes littérales disponibles. (Comparez cela avec VB, qui autorise les DateTime
littéraux et a aussi un alias.)
Il existe une circonstance dans laquelle vous devez utiliser les alias: lors de la spécification explicite du type sous-jacent d'une énumération. Par exemple:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
C'est juste une question de la façon dont les spécifications définit les Déclarations ENUM - la partie après le côlon doit être le type intégré de production, ce qui est un signe de sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
... par opposition à un genre production utilisé par les déclarations de variables par exemple. Cela n'indique aucune autre différence.
Enfin, en ce qui concerne l'utilisation: personnellement, j'utilise les alias partout pour l'implémentation, mais le type CLR pour toutes les API. Peu importe vraiment ce que vous utilisez en termes d'implémentation - la cohérence au sein de votre équipe est agréable, mais personne d'autre ne s'en souciera. D'un autre côté, il est vraiment important que si vous vous référez à un type dans une API, vous le faites d'une manière indépendante de la langue. Une méthode appelée ReadInt32
n'est pas ambiguë, tandis qu'une méthode appelée ReadInt
nécessite une interprétation. L'appelant pourrait utiliser une langue qui définit un int
alias pour Int16
, par exemple. Les concepteurs du framework .NET ont suivi ce modèle, de bons exemples étant dans les BitConverter
, BinaryReader
et les Convert
classes.
string
s'agit d'une construction lexicale de la grammaire C # alors qu'il neSystem.String
s'agit que d'un type. Indépendamment de toute différence explicite mentionnée dans une spécification, il y a toujours cette différence implicite qui pourrait être acceptée avec une certaine ambiguïté. Le langage lui-même doit prendrestring
en charge d'une manière que l'implémentation n'est pas (tout à fait) obligée de considérer pour une classe particulière dans la BCL.