52

En C#, ¿cuál es la diferencia entre String y string? (véase la mayúscula)

Ejemplo:

string s = "¡Hola mundo!";
String S = "¡Hola mundo!";

¿Cuáles son las reglas de uso para cada una? ¿Y cuáles son las diferencias?


Pregunta original: What's the difference between String and string?

Hewbot
  • 1,457
  • 2
  • 11
  • 16
  • 3
    Son el mismo tipo. En realidad, de todas maneras String no es un tipo por valor, pero es aceptado como si lo fuera. Por eso tiene un alias en ambos casos, pero en realidad es siempre el mismo tipo por referencia. – Luis Masuelli Dec 01 '15 at 21:06
  • @LuisMasuelli no te confundas las cosas. La razón de que `String` es un tipo _inmutable_ por referencia es por que, en verdad, es un _Wrapper_ de arreglo de caracteres. – drielnox Dec 02 '15 at 13:35
  • 3
    [Fuente de la pregunta original](http://stackoverflow.com/q/7074) – Hewbot Dec 02 '15 at 15:57

4 Answers4

55

String es el nombre de la clase System.String

string es el alias de System.String en C#: string (C# Reference)

A nivel de ejecución no existe diferencia alguna ya que el compilador convierte ambas líneas en lo mismo.

Por ejemplo esto es lo que genera LINQPad con las sgtes dos declaraciones:

String S = "Hola mundo";
string s = "Hola mundo";

IL generado

Cómo pueden ver ambas línas generan la instrucción:

ldstr "Hola mundo"

De la misma manera por ejemplo al invocar alguno de sus métodos

String.Format("Hola");
string.Format("Hola");

Ambas líneas hacen referencia a la misma clase System.String y generan el mismo código

IL generado 2

Carlos Muñoz
  • 12,864
  • 2
  • 42
  • 62
  • 4
    En C# los alias mapean con los tipos, por ejemplo "string" mapea con "String", "int" mapea con "Int32". Se prefieren los alias a menos que dé lugar a confusión. Stylecop la exige en una de sus reglas de legibilidad de usar siempre los alias. Es cuestión de estilo, para favorecer la homogeneidad en el código. – Sxntk Dec 02 '15 at 15:49
  • No conocía 'LINQPad' se ve interesante – CodeFluid Dec 31 '18 at 19:20
10

Efectivamente, string es un alias de System.String. Microsoft no se decanta en su documentación por ninguna de las dos nomenclaturas Microsoft MSDN C# string.

string frente a System.String

En C#, la palabra clave string es un alias de String.Por lo tanto, String y string son equivalentes y puede utilizar la convención de nomenclatura que prefiera.La clase String proporciona numerosos métodos para crear, manipular y comparar cadenas de forma segura.Además, el lenguaje C# sobrecarga algunos operadores para simplificar operaciones comunes de las cadenas.

Recuerdo haber visto un vídeo de MSDN Channel 9 en el que recomendaban string para variables locales, y String especialmente para parámetros y tipos de retorno. Desgraciadamente, soy incapaz de encontrar el vídeo ahora mismo. Y además, me parece una distinción innecesaria y que probablemente será muy difícil llevar a cabo.

Baltasarq
  • 1,084
  • 8
  • 11
9

string en C# es un alias del Tipo de .NET Framework (CLR type) System.String

(Idem por ejemplo a System.Int32 & int)

Puedes utilizarlo como alias, pero a veces en organizaciones se utilizan políticas de codificación para por ejemplo utilizar en el constructor la clase (y no el alias) por mas que lo puedas utilizar.

Ejemplo:

const char char1 = 'a';
var cadena1 = new string(char1, 1);
var cadena2 = new String(char1, 1);

Pero por ejemplo no se puede crear alias de string. Ejemplo de alias:

using alias1 = string;  //Error de compilacion
using CodigoBarraCadena = System.String;
using NombreDescriptivoCadena = System.String;

Para ser utilizado para una mejor compresión del código

var tupla1 = new Tuple<CodigoBarraCadena, NombreDescriptivoCadena>("1", "2"); //Mas descriptivo

var tupla2 = new Tuple<string, string>("1", "2"); //Menos descriptivo
Jose A. Fernandez
  • 2,172
  • 6
  • 16
  • Personalmente estoy en contra de ponerle un nombre descriptivo como alias a System.String, puesto que esa es responsabilidad de los identificadores de variables mas no de tipos. En todo caso si se quiere definir especificamente de que trata cada uno de los strings mejor sería crear una clase personalizada de cada una con sus propias reglas y validaciones que internamente contenga un string – Carlos Muñoz Dec 02 '15 at 16:19
9

string es un alias en C# for System.String, en su documentación Microsoft usa string en sus ejemplos.

Dev. Joel
  • 23,229
  • 3
  • 25
  • 44
ADRIAN LANDERO
  • 339
  • 1
  • 5