Solo por completo, aquí hay un volcado de información relacionada ...
Como otros han señalado, string
es un alias para System.String
. Se compilan con el mismo código, por lo que en el momento de la ejecución no hay diferencia alguna. Este es solo uno de los alias en C #. La lista completa es:
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
Aparte de string
y object
, los alias son todos para valorar tipos. decimal
es un tipo de valor, pero no un tipo primitivo en el CLR. El único tipo primitivo que no tiene un alias es System.IntPtr
.
En la especificación, los alias de tipo de valor se conocen como "tipos simples". Los literales se pueden usar para valores constantes de cada tipo simple; ningún otro tipo de valor tiene formas literales disponibles. (Compare esto con VB, que permite DateTime
literales y también tiene un alias).
Hay una circunstancia en la que tiene que utilizar los alias: al especificar explícitamente el tipo subyacente de una enumeración. Por ejemplo:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
Eso es sólo una cuestión de la forma en la especificación define enumeración declaraciones - la parte después de los dos puntos tiene que ser el de tipo integral de producción, que es una muestra de sbyte
, byte
, short
, ushort
, int
, uint
,long
, ulong
, char
... en lugar de un tipo de producción, utilizado por las declaraciones de variables, por ejemplo. No indica ninguna otra diferencia.
Finalmente, cuando se trata de qué usar: personalmente uso los alias en todas partes para la implementación, pero el tipo CLR para cualquier API. Realmente no importa demasiado lo que use en términos de implementación: la consistencia entre su equipo es agradable, pero a nadie más le importará. Por otro lado, es realmente importante que si se refiere a un tipo en una API, lo haga de forma neutral en cuanto al idioma. Un método llamado ReadInt32
no es ambiguo, mientras que un método llamado ReadInt
requiere interpretación. La persona que llama podría estar usando un lenguaje que define un int
alias para Int16
, por ejemplo. Los diseñadores marco .NET han seguido este patrón, buenos ejemplos de estar en las BitConverter
, BinaryReader
y Convert
las clases.
string
es una construcción léxica de la gramática de C #, mientras queSystem.String
es solo un tipo. Independientemente de cualquier diferencia explícita mencionada en cualquier especificación, todavía existe esta diferencia implícita que podría ser acomodada con cierta ambigüedad. El lenguaje en sí mismo debe soportarstring
de manera que la implementación no esté (tan) tan obligada a considerar para una clase particular en el BCL.