¿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 las pautas para el uso de cada uno? Y cuales son las diferencias?

preguntado el 10 de agosto de 08 a las 08:08

@ORMapper, pero el hecho es que string es una léxico construcción de C # gramática mientras System.String es solo un tipo. Independientemente de cualquier explícito diferencia mencionada en cualquier especificación, todavía existe esta diferencia implícita que podría acomodarse con cierta ambigüedad. El idioma en si deberán AYUDA string de una manera que la implementación no está (del todo) tan obligada a considerar para una clase particular en la BCL. -

@KirkWoll: según la especificación del idioma, el idioma en sí deberán que consideren string para ser exactamente igual que el tipo BCL System.String, nada más. Eso no es ambiguo en absoluto. Por supuesto, puede implementar su propio compilador, usando la gramática C #, y usar todos los tokens encontrados así para algo arbitrario, no relacionado con lo que se define en la especificación del lenguaje C #. Sin embargo, el lenguaje resultante solo sería similar a C #, no podría considerarse C #. -

Puedes usar string sin una directiva using para System. No puedes hacer eso con String. -

Para alguien que viene de Algol y Fortran, esta discusión muestra que hay algo mal con string. Es necesario abreviar System.String, pero, como alias, parece bastante, pero no exactamente lo mismo. Sin embargo, después de varios años de C #, diría que es seguro simplemente usar string y string.Format() y no te preocupes por System.String. -

@Sangeeta ¿Qué estás diciendo? La System.String la clase sigue ahí, y el string La palabra clave sigue siendo un alias para ella. Al igual que System.Int32 y int. Son literalmente lo mismo. -

30 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, ya que StyleCop ahora impone el uso de los alias específicos de C #.

Respondido el 22 de enero de 19 a las 21:01

Si decide usar StyleCop y sigue eso, eso dirá que use los tipos específicos del idioma. Entonces, para C # tendrá string (en lugar de String), int (en lugar de Int32), float (en lugar de Single) - stylecop.soyuz5.com/SA1121.html - Dominic Zukiewicz

Siempre uso los alias porque asumí que algún día podría ser útil porque actúan como una abstracción, por lo que pueden cambiar sus implementaciones sin que yo lo sepa. - Robar

Visual Studio 2015 dice que String.Format debería cambiarse a string.Format, así que supongo que Microsoft va por ese camino. También siempre he usado String para los métodos estáticos. - Sami Kuhmonen

¿Qué le parece el hecho de que podría definir su propio tipo "Cadena", pero no puede hacer lo mismo con "cadena", ya que es una palabra clave, como se explica en stackoverflow.com/questions/7074/… - jmoreno

Supongo que entonces ... Solo sé coherente. Use string o String o use un cerntain one en un caso específico, pero siempre en ese caso. - Rob L

En aras de la integridad, aquí hay un volcado cerebral de información relacionada ...

Como han señalado otros, string es un alias para System.String. Asumiendo su código usando String compila a System.String (es decir, no tiene una directiva de uso para algún otro espacio de nombres con un String type), se compilan en 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 CLR. El único tipo primitivo que no tiene alias es System.IntPtr.

En la especificación, los alias de tipo de valor se conocen como "tipos simples". Los literales se pueden utilizar para valores constantes de todo 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 tener para usar 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 solo una cuestión de la forma en que la especificación define las declaraciones de enumeración: la parte después de los dos puntos tiene que ser la tipo integral producción, que es una muestra de sbyte, byte, short, ushort, int, uint, long, ulong, char... a diferencia de un clase producción tal como la utilizan las declaraciones de variables, por ejemplo. No indica ninguna otra diferencia.

Finalmente, cuando se trata de cuál usar: personalmente, uso los alias en todas partes para la implementación, pero el tipo CLR para cualquier API. Realmente no importa demasiado cuál use en términos de implementación: la consistencia entre su equipo es buena, pero a nadie más le va a importar. Por otro lado, es realmente importante que si hace referencia a un tipo en una API, lo haga de una manera neutral en cuanto al lenguaje. 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 de .NET Framework han seguido este patrón, siendo buenos ejemplos en el BitConverter, BinaryReader y Convert clases.

Respondido 18 Oct 20, 08:10

String representa System.String y es un tipo .NET Framework. string es un alias en el lenguaje C # para System.String. Ambos se compilan para System.String en IL (Lenguaje intermedio), por lo que no hay diferencia. Elija lo que le guste y úselo. Si codifica en C #, preferiría string ya que es un alias de tipo C # y bien conocido por los programadores de C #.

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

Respondido el 03 de diciembre de 11 a las 23:12

Personalmente prefiero usar "Int32", ya que muestra inmediatamente el rango del valor. Imagínese si actualizaran el tipo de "int" en sistemas posteriores de bits superiores. 'int' en c aparentemente se ve como "el tipo de entero con el que el procesador de destino es más eficiente para trabajar"y definido como "al menos 16 bits". Preferiría una consistencia predecible allí, muchas gracias. - Nyerguds

@MyDaftQuestions Estoy de acuerdo. En todo caso, tendría sentido usar consistentemente los tipos .net porque ignoran el idioma y el tipo es obvio, independiente de cualquier idioma (¿conozco todas las idiosincrasias de F # o VB?). - Peter - Reincorporar a Monica

@Nyerguds Hay dos razones para simplemente no preocuparse por eso. Uno es que int se define en la especificación del lenguaje C # como un entero de 32 bits independientemente del hardware. C #, a pesar de una herencia compartida en la noche de los tiempos, en realidad no es C. Cambiando int a un entero de 64 bits sería un cambio rotundo en la especificación y el lenguaje. También requeriría redefinir long, ya que long es actualmente el entero de 64 bits. La otra razón para no preocuparse es irrelevante ya que los tipos nunca cambiarán, pero .NET es lo suficientemente abstracto como para que el 99% del tiempo no tenga que pensar en ello de todos modos. ;-) - Craig

@Craig Busco en muchos formatos de juegos patentados antiguos en los que do Sin embargo, tengo que pensar en eso todo el tiempo. Y luego usando Int16, Int32 y Int64 es una montón más transparente en el código que usar el bastante no descriptivo short, int y long - Nyerguds

Pero corto, no, largo, flotante, doble, et al. son descriptivos, porque están en la especificación del idioma. C # no es C. Los prefiero en las declaraciones porque son concisos, pequeños y estéticamente agradables. Prefiero los nombres de la biblioteca Torre en las API donde la API tiene una dependencia del tipo de datos. - Craig

La mejor respuesta que he escuchado sobre el uso de los alias de tipo proporcionados en C # proviene de Jeffrey Richter en su libro CLR a través de C #. Estas son sus 3 razones:

  • He visto a varios desarrolladores confundidos, sin saber si usar cadena or Cordón en su código. Debido a que en C # la cadena (una palabra clave) se asigna exactamente a System.String (un tipo FCL), no hay diferencia y se puede usar cualquiera de las dos.
  • C ª#, Corto mapas a System.Int64, pero en un lenguaje de programación diferente, Corto podría mapear a un Int16 or Int32. De hecho, C ++ / CLI trata siempre como un 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 tratan Corto como palabra clave y no compilará código que lo use.
  • El FCL tiene muchos métodos que tienen nombres de tipo como parte de sus nombres de método. Por ejemplo, el BinaryReader type ofrece métodos como LeerBoolean, ReadInt32, Leer solo, y así sucesivamente, y el System.Convert type ofrece métodos como ToBoolean, ToInt32, ToSingle, y así. Aunque es legal escribir el siguiente código, la línea con float me parece muy poco natural 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

Así que ahí lo tienes. Creo que todos estos son puntos realmente buenos. Sin embargo, no me encuentro usando los consejos 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 del marco.

Respondido 04 Jul 18, 14:07

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

Si por alguna razón quisiera una variable llamada cadena, verías solo 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 cadena puedes usar @ como prefijo:

StringBuilder @string = new StringBuilder();

Otra diferencia crítica: Stack Overflow los resalta de manera diferente.

Respondido el 27 de diciembre de 17 a las 20:12

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

Respondido 03 Oct 16, 21:10

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

respondido 19 nov., 11:13

No entiendo qué significa esta respuesta y por qué se votó a favor. Puedes usar typeof(string) en la reflexión. Ejemplo uno: if (someMethodInfo.ReturnType == typeof(string)) { ... } Ejemplo dos: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance); ¿Dónde es que debes usar? Stringno, string? Si intentas cosas como Type.GetType("String") or Type.GetType("string"), ninguno encontrará la clase porque falta el espacio de nombres. Si por algunos tonto razón por la que comparas .Name de un tipo para "string" de una manera que distingue entre mayúsculas y minúsculas, tiene razón. - Jeppe Stig Nielsen

System.String es la clase de cadena .NET - en C # string es un alias para System.String - por lo que en uso son los mismos.

En cuanto a las pautas, no me atascaría demasiado y solo usaría lo que quiera: hay cosas más importantes en la vida y el código será el mismo de todos modos.

Si se encuentran construyendo sistemas en los que es necesario especificar el tamaño de los números enteros que están usando y, por lo tanto, tienden a usar Int16, Int32, UInt16, UInt32 etc., entonces podría parecer más natural de usar String - y al moverse entre diferentes lenguajes .net, podría hacer las cosas más comprensibles; de lo contrario, usaría string e int.

Respondido 06 Feb 18, 15:02

Prefiero las mayúsculas .NET tipos (en lugar de los alias) por motivos de formato. La .NET los tipos tienen el mismo color que otros tipos de objetos (los tipos de valor son objetos adecuados, después de todo).

Palabras clave condicionales y de control (como if, switchy return) son minúsculas y de color azul oscuro (por defecto). Y prefiero no tener el desacuerdo en el uso y formato.

Considerar:

String someString; 
string anotherString; 

Respondido el 28 de Septiembre de 16 a las 14:09

string y String son idénticos en todos los aspectos (excepto la "S" mayúscula). No hay implicaciones de rendimiento de ninguna manera.

minúsculas string se prefiere en la mayoría de los proyectos debido al resaltado de sintaxis

respondido 19 nov., 11:13

C # es un lenguaje que se usa junto con CLR.

string es un tipo en C #.

System.String es un tipo en CLR.

Cuando usa C # junto con CLR string será mapeado a System.String.

Teóricamente, podría implementar un compilador de C # que generara el código de bytes de Java. Una implementación sensata de este compilador probablemente mapearía string a java.lang.String para interoperar con la biblioteca de tiempo de ejecución de Java.

Respondido el 25 de diciembre de 15 a las 15:12

Este YouTube el video demuestra prácticamente en qué se diferencian.

Pero ahora para una larga respuesta textual.

Cuando hablamos de .NET hay dos cosas diferentes una hay .NET framework y el otro hay lenguajes ( C#, VB.NET etc) que utilizan ese marco.

enter image description here

"System.String"también conocido como" Cadena "(" S "mayúscula) es una .NET tipo de datos de marco mientras que "cadena" es un C# tipo de datos

enter image description here

En resumen, "Cadena" es un alias (lo mismo llamado con diferentes nombres) de "cadena". Entonces, técnicamente, las dos declaraciones de código siguientes darán el mismo resultado.

String s = "I am String";

or

string s = "I am String";

De la misma manera, hay alias para otros tipos de datos de c # como se muestra a continuación: -

: System.Object, cuerda: System.String, bool: System.Boolean, byte: System.Byte, sbyte: System.SByte, corto: System.Int16 y así

Ahora la pregunta del millón de dólares desde el punto de vista del programador. Entonces, ¿cuándo usar "String" y "String"?

Lo primero para evitar confusiones es utilizar uno de ellos de forma coherente. Pero desde la perspectiva de las mejores prácticas, cuando realiza una declaración de variables, es bueno usar "cadena" ("s" pequeña) y cuando la usa como nombre de clase, se prefiere "Cadena" ("S" mayúscula).

En el siguiente código, el lado izquierdo es una declaración de variable y se declaró usando "cadena". En el lado derecho, estamos llamando a un método, por lo que "String" es más sensato.

string s = String.ToUpper() ;

Respondido el 26 de enero de 21 a las 12:01

¿Pero ahora tienes 2 estilos en una línea? :) - Wouter

Minúscula string es un alias para System.String. Son iguales en C#.

Existe un debate sobre si debería utilizar los tipos de sistema (System.Int32, System.String, etc.) tipos o el C# aliases (int, string, etc.). Personalmente creo que deberías usar el C# aliases, pero esa es solo mi preferencia personal.

Respondido 14 ago 17, 07:08

Ese es el problema, no son alias 'C #', son alias 'C'. No hay una 'cadena' o 'int' nativa en el lenguaje C #, solo azúcar sintáctico. - Quarkly

No estoy seguro de dónde vino "C", ya que la especificación del lenguaje C # 5 dice "La cadena de palabras clave es simplemente un alias para la clase predefinida System.String". en la página 85, párrafo 4.2.4. Todos los lenguajes de alto nivel son azúcar sintáctico sobre conjuntos de instrucciones de CPU y código de bytes. - aiodintsov

string es solo un alias para System.String. El compilador los tratará de forma idéntica.

La única diferencia práctica es el resaltado de sintaxis como mencionas, y que tienes que escribir using System si usas String.

Respondido el 03 de diciembre de 11 a las 23:12

No necesita prefijar System para usar String. - Joe Ratzer

Tienes que incluir un using System cuando se utiliza String, de lo contrario obtendrá el siguiente error: The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?) - Ronald

Ambos son lo mismo. Pero desde la perspectiva de las pautas de codificación, es mejor usar string en lugar de String. Esto es lo que generalmente usan los desarrolladores. por ejemplo, en lugar de usar Int32 usamos int as int es alias a Int32

FYI "La cadena de palabras clave es simplemente un alias para la clase predefinida System.String. " - Especificación del lenguaje C # 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

Respondido 14 ago 17, 08:08

Como dicen los demás, son iguales. Las reglas de StyleCop, por defecto, le obligarán a usar string como una práctica recomendada de estilo de código C #, excepto cuando se hace referencia System.String funciones estáticas, como String.Format, String.Join, String.ConcatEtc. ...

respondido 19 nov., 11:13

Nueva respuesta después de 6 años y 5 meses (procrastinación).

Aunque la string es una palabra clave reservada de C # que siempre tiene un significado fijo, String es solo un ordinario identificador que podría referirse a cualquier cosa. Dependiendo de los miembros del tipo actual, el espacio de nombres actual y el using directivas y su ubicación, String podría ser un valor o un tipo distinto de global::System.String.

Proporcionaré dos ejemplos donde using las directivas no ayudarán.


Primero, cuando String es una VALORAMOS del tipo actual (o una variable local):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

Lo anterior no se compilará porque IEnumerable<> no tiene un miembro no estático llamado Formaty no se aplican métodos de extensión. En el caso anterior, aún puede ser posible utilizar String en otros contextos donde un clase es la única posibilidad sintácticamente. Por ejemplo String local = "Hi mum!"; podría estar bien (dependiendo del espacio de nombres y using directivas).

Peor: decir String.Concat(someSequence) probablemente (dependiendo de usings) vaya al método de extensión Linq Enumerable.Concat. No irá al método estático. string.Concat.


En segundo lugar, cuando String es otro clase, anidado dentro del tipo actual:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Ninguna declaración en el Example compila el método. Aquí String siempre es un piano cadena, MyPiano.String. Ningún miembro (static o no) Format existe en él (o se hereda de su clase base). Y el valor "Goodbye" no se puede convertir en él.

Respondido el 15 de enero de 15 a las 17:01

El uso de tipos de sistema facilita la migración entre C # y VB.Net, si le gustan ese tipo de cosas.

Respondido el 22 de Septiembre de 08 a las 23:09

Contra lo que parece ser una práctica común entre otros programadores, prefiero String encima string, solo para resaltar el hecho de que String es un tipo de referencia, como mencionó Jon Skeet.

respondido 19 nov., 11:13

string es un alias (o taquigrafía) de System.String. Eso significa, escribiendo string nos referimos System.String. Puede leer más en el enlace Think: 'cadena' es un alias / abreviatura de System.String.

Respondido 08 Oct 16, 21:10

Solo me gustaría agregar esto a la respuesta de lfousts, del libro de Ritchers:

La especificación del lenguaje C # establece: "Por cuestión de estilo, se prefiere el uso de la palabra clave sobre el uso del nombre completo del tipo de sistema". No estoy de acuerdo con la especificación del idioma; Prefiero usar los nombres de tipo FCL y evitar por completo los nombres de tipo primitivos. De hecho, desearía que los compiladores ni siquiera ofrecieran los nombres de los tipos primitivos y obligaran a los desarrolladores a utilizar los nombres de los tipos FCL en su lugar. Estas son mis razones:

  • He visto a varios desarrolladores confundidos, sin saber si usar cadena or Cordón en su código. Porque en C # cadena (una palabra clave) se asigna exactamente a System.String (un tipo FCL), no hay diferencia y se puede utilizar cualquiera. Del mismo modo, he oído a algunos desarrolladores decir que int representa un número entero de 32 bits cuando la aplicación se ejecuta en un sistema operativo de 32 bits y que representa un número entero de 64 bits cuando la aplicación se ejecuta en un sistema operativo de 64 bits. Esta declaración es absolutamente falsa: en C #, un int siempre se asigna a System.Int32y, por lo tanto, representa un número entero de 32 bits independientemente del sistema operativo en el que se esté ejecutando el código. Si los programadores usaran Int32 en su código, esta posible confusión también se elimina.

  • C ª#, Corto mapas a System.Int64, pero en un lenguaje de programación diferente, Corto podría mapear a un Int16 or Int32. De hecho, C ++ / CLI trata Corto 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 tratan Corto como palabra clave y no compilará el código que lo use.

  • El FCL tiene muchos métodos que tienen nombres de tipos como parte de sus nombres de métodos. Por ejemplo, el BinaryReader type ofrece métodos como LeerBoolean, ReadInt32, Leer solo, y así sucesivamente, y el System.Convert type ofrece métodos como ToBoolean, ToInt32, ToSingle, y así. Aunque es legal escribir el siguiente código, la línea con flotar me parece muy poco natural, 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
    
  • Muchos programadores que usan C # exclusivamente tienden a olvidar que se pueden usar otros lenguajes de programación contra CLR y, debido a esto, los ismos de C # se introducen en el código de la biblioteca de clases. Por ejemplo, el FCL de Microsoft está escrito casi exclusivamente en C # y los desarrolladores del equipo FCL ahora han introducido métodos en la biblioteca como Formación, GetLongLength, que devuelve un Int64 valor que es un Corto en C # pero no en otros lenguajes (como C ++ / CLI). Otro ejemplo es System.Linq.Enumerable, LongCount método.

No obtuve su opinión antes de leer el párrafo completo.

Respondido el 05 de diciembre de 18 a las 12:12

Cuerda (System.String) es una clase en la biblioteca de clases base. string (minúsculas) es un trabajo reservado en C # que es un alias para System.String. Int32 vs int es una situación similar a la Boolean vs. bool. Estas palabras clave específicas del lenguaje C # le permiten declarar primitivas en un estilo similar a C.

Respondido el 24 de diciembre de 13 a las 08:12

Es una cuestión de convención, de verdad. string simplemente se parece más al estilo C / C ++. La convención general es utilizar los atajos que haya proporcionado el idioma elegido (int / Int para Int32). Esto se aplica a "objeto" y decimal también.

En teoría, esto podría ayudar a transferir el código a algún estándar futuro de 64 bits en el que "int" podría significar Int64, pero ese no es el punto, y esperaría que cualquier asistente de actualización cambie cualquier int referencia a Int32 de todos modos solo para estar seguro.

Respondido 03 Oct 18, 07:10

String no es una palabra clave y se puede utilizar como identificador, mientras que string es una palabra clave y no se puede utilizar como identificador. Y en el punto de vista funcional ambos son iguales.

respondido 19 nov., 11:13

Llegar tarde a la fiesta: uso los tipos CLR el 100% del tiempo (bueno, excepto si forzado para usar el tipo C #, pero no recuerdo cuándo fue la última vez).

Originalmente comencé a hacer esto hace años, según los libros CLR de Ritchie. Para mí, tenía sentido que todos los lenguajes CLR en última instancia, tuvieran que ser compatibles con el conjunto de tipos CLR, por lo que el uso de los tipos CLR proporcionó un código más claro y posiblemente más "reutilizable".

Ahora que lo he estado haciendo durante años, es un hábito y me gusta la coloración que muestra VS para los tipos CLR.

La única decepción real es que la función de autocompletar usa el tipo C #, por lo que termino volviendo a escribir los tipos generados automáticamente para especificar el tipo CLR.

Además, ahora, cuando veo "int" o "string", me parece realmente incorrecto, como si estuviera viendo el código C de los años 1970.

Respondido 24 ago 12, 19:08

No hay diferencia.

La palabra clave C # string se asigna al tipo .NET System.String - es un alias que se ajusta a las convenciones de nomenclatura del idioma.

De manera similar, los int mapas a System.Int32.

Respondido el 15 de enero de 12 a las 04:01

@JaredPar (¡un desarrollador en el compilador de C # y prolífico usuario de SO!) escribió un gran publicación en el blog en este tema. Creo que vale la pena compartirlo aquí. Es una buena perspectiva sobre nuestro tema.

string vs String no es un debate de estilo

[...]

La palabra clave string tiene un significado concreto en C #. Es el tipo System.String que existe en el ensamblado de tiempo de ejecución del núcleo. El tiempo de ejecución comprende intrínsecamente este tipo y proporciona las capacidades que los desarrolladores esperan para las cadenas en .NET. Su presencia es tan crítica para C # que si ese tipo no existe, el compilador se cerrará antes de intentar siquiera analizar una línea de código. Por eso string tiene un significado preciso e inequívoco en el código C #.

El identificador String aunque no tiene un significado concreto en C #. Es un identificador que pasa por todas las reglas de búsqueda de nombres como Widget, Student, etc ... Podría enlazarse a una cadena o podría enlazarse a un tipo en otro ensamblado por completo cuyos propósitos pueden ser completamente diferentes a string. Peor aún, podría definirse de tal manera que un código como String s = "hello"; continuó compilando.

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

El significado real de String siempre dependerá de la resolución del nombre. Eso significa que depende de todos los archivos fuente del proyecto y de todos los tipos definidos en todos los ensamblados referenciados. En resumen, requiere bastante contexto para sabes qué lo que significa.

Es cierto que en la gran mayoría de los casos String y string se unirá al mismo tipo. Pero usando String todavía significa que los desarrolladores están dejando su programa a la interpretación en lugares donde solo hay una respuesta correcta. Cuándo String se une al tipo incorrecto, puede dejar a los desarrolladores depurando durante horas, presentando errores en el equipo del compilador y, en general, perdiendo el tiempo que podría haberse ahorrado utilizando string.

Otra forma de visualizar la diferencia es con esta muestra:

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code

Muchos argumentarán que si bien esta es información técnicamente precisa usando String todavía está bien porque es extremadamente raro que una base de código defina un tipo de este nombre. O que cuando String está definido, es una señal de una base de código incorrecta.

[...]

Ya veras eso String se define para una serie de propósitos completamente válidos: ayudantes de reflexión, bibliotecas de serialización, lexers, protocolos, etc. Para cualquiera de estas bibliotecas String vs string tiene consecuencias reales dependiendo de dónde se utilice el código.

Así que recuerda cuando veas el String vs string Debate esto es sobre semántica, no sobre estilo. La elección de una cadena le da un significado nítido a su código base. Elegir String no está mal, pero deja la puerta abierta a sorpresas en el futuro.

Nota: Copio / pego la mayoría de las publicaciones del blog por razones de archivo. Ignoro algunas partes, por lo que recomiendo omitir y leer el blog si puedes.

Respondido el 26 de enero de 21 a las 03:01

Me alegra encontrar esta respuesta aquí. Hay una diferencia y es importante. - shoelzer

Hay una cita sobre este tema en El libro de Daniel Solis.

Todos los tipos predefinidos se asignan directamente a los tipos .NET subyacentes. Los nombres de tipo C # (cadena) son simplemente alias para los tipos .NET (String o System.String), por lo que el uso de los nombres .NET funciona bien desde el punto de vista sintáctico, aunque no se recomienda. Dentro de un programa de C #, debe usar los nombres de C # en lugar de los nombres de .NET.

Respondido el 11 de diciembre de 16 a las 08:12

Sí, no hay diferencia entre ellos, al igual que el bool y Boolean.

Respondido el 25 de diciembre de 15 a las 15:12

cadena es una palabra clave y no puede usar una cadena como identificador.

Cordón no es una palabra clave y puede utilizarla como identificador:

Ejemplo

string String = "I am a string";

La palabra clave string es un alias para System.String Aparte del problema de las palabras clave, las dos son exactamente equivalentes.

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

respondido 16 mar '16, 22:03

La única pequeña diferencia es que si usa la clase String, necesita importar el espacio de nombres del sistema en la parte superior de su archivo, mientras que no tiene que hacer esto cuando usa la palabra clave string. - uttam

Hay casos de uso simples en los que la declaración de igualdad fallaría ... Como definir un tipo de llamada String en el espacio de nombres bla e importar ese espacio de nombres en el archivo en el que se ejecuta la declaración de igualdad. - Rick el chivo expiatorio

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.