Pregunta ¿Cuál es la diferencia entre String y string en C #?


Ejemplo (nota el caso)

string s = "Hello world!";
String s = "Hello world!";

¿Cuáles son los lineamientos para el uso de cada uno? Y cuales son los diferencias?


5345


origen


Respuestas:


string es un alias en C # para System.String.
Entonces, técnicamente, no hay diferencia. Es como int  vs.  System.Int32.

En cuanto a las pautas, generalmente se recomienda usar string cada vez que te refieres a un objeto.

p.ej.

string place = "world";

Del mismo modo, creo que generalmente se recomienda usar String si necesita referirse específicamente a la clase.

p.ej.

string greet = String.Format("Hello {0}!", place);

Este es el estilo que Microsoft tiende a usar en sus ejemplos.


Parece que la orientación en esta área puede haber cambiado, como StyleCop ahora impone el uso de los alias específicos de C #.


5088



Solo para completar, aquí hay un montón de información relacionada ...

Como otros han notado, string es un alias para System.String. 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 tipos de valor. 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 todos los tipos simples; ningún otro tipo de valor tiene formularios literales disponibles. (Compare esto con VB, que permite DateTime literales, y también tiene un alias).

Hay una circunstancia en la que tener para usar los alias: cuando se especifica explícitamente el tipo subyacente de una enumeración. Por ejemplo:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Esa es solo una cuestión de la forma en que la especificación define las declaraciones enum: la parte después del colon debe ser la tipo integral producción, que es una muestra de sbyte, byte, short, ushort, int, uint, long, ulong, char... a diferencia de un tipo producción utilizada por declaraciones variables, por ejemplo. No indica ninguna otra diferencia.

Finalmente, cuando se trata de usar: personalmente utilizo los alias en todas partes para la implementación, pero el tipo CLR para cualquier API. Realmente no importa demasiado lo que usas en términos de implementación: la consistencia entre tu equipo es agradable, pero a nadie más le va a importar. Por otro lado, es realmente importante que si se refiere a un tipo en una API, lo haga de una manera neutral en cuanto al idioma. Un método llamado ReadInt32 es inequívoco, 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 del framework .NET han seguido este patrón, buenos ejemplos están en el BitConverter, BinaryReader y Convert clases


3031



String representa System.String y es un tipo de .NET Framework. string es un alias en el lenguaje C # para System.String. Ambos están compilados para System.String en IL(Lenguaje intermedio), entonces no hay diferencia. Elige lo que te gusta y usa eso. Si codifica en C #, preferiría string ya que es un alias de tipo C # y muy conocido por los programadores de C #.

Puedo decir lo mismo sobre (int, System.Int32) etc.


607



La mejor respuesta que he escuchado sobre el uso de alias de tipo proporcionado en C # proviene de Jeffrey Richter en su libro CLR a través de C #. Aquí están sus 3 razones:

  • He visto a varios desarrolladores confundidos, sin saber si usar cuerda o Cuerda en su código. Como en C #, la cadena (una palabra clave) se correlaciona exactamente con System.String (un tipo FCL), no hay diferencia y puede usarse.
  • Cª#, largo mapas para System.Int64, pero en un lenguaje de programación diferente largo podría mapear a un Int16 o Int32. De hecho, C ++ / CLI de hecho trata el tiempo como una Int32. Alguien que lea el código fuente en un idioma podría malinterpretar fácilmente la intención del código si estuviera acostumbrado a programar en un lenguaje de programación diferente. De hecho, la mayoría de los idiomas ni siquiera tratarán largo como palabra clave y no compilará el código que lo usa.
  • La FCL tiene muchos métodos que tienen nombres de tipos como parte de sus nombres de métodos. Por ejemplo, el BinaryReader tipo ofrece métodos tales como ReadBoolean, ReadInt32, ReadSingle, y así sucesivamente, y el System.Convert tipo ofrece métodos tales como ToBoolean, ToInt32, ToSingle, y así. Aunque es legal escribir el siguiente código, la línea con flotador se siente muy antinatural para mí, y no es obvio que la línea sea correcta:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Entonces ahí lo tienes. Creo que estos son todos puntos realmente buenos. Sin embargo, no encuentro el consejo de Jeffrey en mi propio código. Tal vez estoy demasiado atrapado en mi mundo C # pero termino tratando de hacer que mi código se vea como el código de framework.


409



string es una palabra reservada, pero String es solo un nombre de clase. Esto significa que string no se puede usar como un nombre de variable en sí mismo.

Si por alguna razón quieres una variable llamada cuerda, solo verías la primera de estas compilaciones:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Si realmente quieres un nombre de variable llamado cuerda puedes usar @ como prefijo:

StringBuilder @string = new StringBuilder();

Otra diferencia fundamental: Stack Overflow los resalta de manera diferente.


380



Hay una diferencia - no puedes usar String sin using System; antemano.


327



Ha sido cubierto arriba; sin embargo, no puedes usar string en la reflexión; debes usar String.


269