sábado, 26 de julio de 2014

Pregunta C# (3 de 20): ¿Cuál es la Diferencia entre String y string?

Tabla de Contenido

0. Introducción
1. Documentación
1.1 String
1.2 string
2. String y string en Visual Studio y Notepad++
2.1 Visual Studio
2.2 Notepad++
2.3 Otros editores
3. Enumeración de Diferencias Sobresalientes
4. Ejemplo de Uso
5. Recursos
6. Conclusiones
7. Glosario
8. Literatura & Enlaces

0. Introducción

Tercera pregunta (de veinte) C# en la que vamos a comprender la(s) diferencia(s) entre String y string. Para lograrlo, estudiáremos las convenciones estándar de código C#. Distinguiremos, igualmente, la diferencia visual (impresora estética) entre estas dos representaciones en el IDE Visual Studio y Notepad++. Los ejemplos de código C# nos demostrarán de forma fehaciente las coincidencias que existen con los tipos definidos en la biblioteca base de tipos de .NET Framework. ¡Manos a la obra!

1. Documentación

Veamos cómo estos dos tipos, String y string, se hayan documentados en MSDN.

1.1 String (descripción convencional de tipos)

La clase String, de acuerdo con [3], representa un texto como una serie de caracteres Unicode. Esta clase hereda directamente del tipo base Object. En [3], encontramos que al igual que muchos tipos de la biblioteca base de clases de .NET Framework, la descripción documental para este tipo se expone con las categorías convencionales, como:
  • Constructores
  • Campos
  • Métodos
  • Operadores
  • Propiedades
Miembros String en MSDN
Figura 1. Miembros String en MSDN.

1.2 string (referencia C#)


En la documentación de MSDN encontramos que este tipo de dato es descrito como una palabra clave o constructo del lenguaje C#:
Palabra clave string en MSDN
Figura 2. Palabra clave string en MSDN.
Evidentemente, la diferencia en este apartado documental consiste en que String es tratado como un tipo de la biblioteca base de clase (BCL, por sus siglas en inglés), mientras que string es considerado uno de los constructos propios del lenguaje de programación C#.

2. String y string en Visual Studio y Notepad++

Antes de pasar a la enumeración de las diferencias sobresalientes de estas representaciones para textos, veamos visualmente cómo los editores de código fuente del IDE Visual Studio y el editor de código fuente Notepad++ diferencian respecto a su impresora estética:

2.1 Visual Studio


Visual Studio hace una distinción visual entre el tipo String y la palabra clave string. La Figura 3 muestra esta diferencia de la impresora estética para la sintaxis de C# en el editor de código fuente de este IDE:
String y string en editor de código fuente de Visual Studio.
Figura 3. String y string en editor de código fuente de Visual Studio.

2.2 Notepad++


En el editor de código fuente Notepad++ sucede algo similar. Véamoslo en la Figura 4:
String y string en editor de código fuente de Notepad++
Figura 4. String y string en editor de código fuente de Notepad++.

2.3 Otros editores

En la Red hay un sin número de herramientas para pegar código fuente C# y compartirlo públicamente o embeberlo en un sitio Web o blog (como ocurre en xCSw). Por ejemplo GitHub Gist [4] también distingue entre ambas representaciones:
String y string en editor de código fuente de GitHub Gist
Figura 5. String y string en editor de código fuente de GitHub Gist.
[Nota: GitHub Gist cuenta con esta impresora estética que ayuda a distinguir entre las representaciones en cuestión, en este blog prefiero utilizar Pastebin.com [5] por su alto grado de compatibilidad entre navegadores.]

3. Enumeración Diferencias Sobresalientes

A parte de atender a las lecturas del curso Twenty C# Questions Explained para comprender la diferencia entre las representaciones de serie de caracteres String y string, acudo a la pregunta c# - What's the difference between String and string? - Stack Overflow [2] en Stackoverflow.com, la cual se haya bien documentada respecto a la diferenciación que estamos estudiando. A continuación un sumario extraído de estas dos fuentes:
  • string es un alias de la clase System.String.
  • Úsese string para cualquier instancia:

    string blog = "Blog xCSw";
  • Para acceder a los métodos estáticos de la clase String, recurra al uso de String:

    string blog = String.Format("Blog {0}", "xCSw");
  • string es una palabra clave, no puede ser utilizada como un identificador:

    String string = "Blog xCSw"; // Genera el error CS1525
  • String no es una palabra clave, por lo tanto  puede ser utilizada como un identificador:
    string String = "Blog xCSw";
  • Para usar la clase String se debe usar el nombre de espacios System:
    using System;
  • Para poder utilizar string como identificador es necesario utilizar el prefijo @:

    String @string = "Blog xCSw";
  • Tanto String como string son compilados en lenguaje intermedio (IL) como System.String.
  • No existen implicaciones de rendimiento entre una representación y otra.
  • En reflection, se debe usar String, en lugar de string.
Me ha parecido interesante el diagrama expuesto en una de las respuestas halladas en [2], el cual consiste en aclarar o recordar que C# es uno de los lenguajes que utiliza el Framework .NET, por lo tanto puede agregar extensiones o construcciones, como por ejemplo, las palabras claves o los alias:
Uso de .NET Framework por parte de C#
Figura 6. Uso de .NET Framework por parte de C# [2].
[Nota: Sugiero la lectura de [2] para obtener aún más detalles acerca de las diferencias de estas dos representaciones de series de caracteres.]

4. Ejemplo de Uso

Este ejemplo es una adaptación del presentado en la pregunta What is the difference between String y string del curso de MVA Twenty C# Questions Explained.

En las líneas 9 y 10 usamos el operador typeof para obtener en tiempo de ejecución el tipo de dato asociado de String y string, junto con su nombre de espacio, respectivamente. En la línea 16 invocamos el método static Concat, de manera analoga, en la línea 17. Estas dos líneas producen los mismos resultados, sin embargo, como mencionamos en la sección anterior, es recomendable, por convención de código, usar String para referirse a sus métodos, en lugar de string.

Compilación:


  1. csc /target:exe DiferenciaStringYstring.cs

Ejecución assembly:


  1. .\DiferenciaStringYstring.exe

> Prueba de ejecución (ideone.com).

> Prueba de ejecución (local):
Diferencia entre String y string
Figura 7. Diferencia entre String y string.

5. Recursos

El recuso multimedial presentando en el curso Twenty C# Questions Explained en Microsoft Virtual Academy:

6. Conclusiones

Hemos resaltado varias de las diferencias fundamentales entre el uso de la clase String y la palabra clave del lenguaje C# string. A pesar de las sutiles diferencias, hay que recordar que ambas representaciones son compiladas a la representación intermedia de lenguaje (IL) System.String. Debemos tener claro estas diferencias (las descritas en la sección 3), por ejemplo, cuando vayamos a usar reflection, dado que en este contexto sólo se puede usar String. O en el caso de las convenciones de código, se recomienda el uso de String para la invocación de métodos estáticos de esta clase. La próxima pregunta que estudiáremos cómo obtener el path (ruta) en una aplicación consola.

7. Glosario

  • Consola
  • Convención de código
  • IDE
  • String
  • string
  • Tipo
  • Visual Studio

8. Literatura & Enlaces

[1]: Twenty C# Questions Explained - http://www.microsoftvirtualacademy.com
[2]: c# - What's the difference between String and string? - Stack Overflow - http://stackoverflow.com/questions/7074/whats-the-difference-between-string-and-string
[3]: String Class (System) - http://msdn.microsoft.com/en-us/library/system.string%28v=vs.110%29.aspx
[4]: Gists - https://gist.github.com/
[5]: Pastebin.com - #1 paste tool since 2002! - http://pastebin.com/
[6]: Twenty C# Questions Explained, 03, What is the difference between String and string? - YouTube - https://www.youtube.com/watch?v=KAIYom46FCUCa


J

1 comentario:

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.