Mostrando entradas con la etiqueta Articles. Mostrar todas las entradas
Mostrando entradas con la etiqueta Articles. Mostrar todas las entradas

jueves, 3 de diciembre de 2015

Receta C# No. 6-3: Inserción Rápida de Nodos en un Documento XML

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Clase ayudante AyudanteXml
5.2 Clonación de un nodo
6. Práctica: Código C#
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Esta nueva receta C# enseña cómo el programador puede insertar nodos en un documento XML de forma más ágil. En la receta anterior se demostró cómo insertar un nodo usando los métodos directos que provee la clase XmlDocument; en esta oportunidad se muestra a través de una clase ayudante cómo realizar el mismo proceso escribiendo menos código sin dejar a un lado su legibilidad. Además, en breve, se demuestra cómo a través del mecanismo de clonación se puede efectuar una inserción rápida con un número inferior de líneas de código respecto al enfoque de la receta C# No. 6.2.

2. Palabras Clave

  • Atributo
  • Clase ayudante
  • Clonación
  • Documento XML
  • Elemento
  • Nodo
  • XML

3. Problema

Se requiere un enfoque programático más ágil para la inserción de nodos en un documento XML.

4. Solución

La solución consiste en la creación de una clase ayudante que contiene los métodos de agregación de un elemento y un atributo. (Una solución alternativa consiste en la clonación de un nodo existe, alterar sus valores, y agregarlo al documento XML usando los étodos de la clase XmlDocument).

5. Discusión de la Solución

5.1 Clase ayudante AyudanteHelper

En la receta Receta C# No. 6-2: Inserción de Nodos en un Documento XML se mostró cómo insertar elementos -nodos y atributos- en un documento XML usando dos de los métodos disponibles en la clase XmlDocument ("XmlDocument Class", 2015) -CreateElement y CreateAttribute-. A pesar de la abstracción que soporta el diseño de la clase XmlDocument para estas tareas, se puede optar aún por la escritura de una clase ayudante que simplifique los procesos de inserción de nodos y atributos de forma más ágil y sencilla.

Continuando, la clase AyudanteHelper que se diseña en la sección de práctica cuenta con métodos de alto nivel para soportar el requerimiento:
  • InsertarElemento y 
  • InsertarAtributo
Esta clase será usada por la clase cliente InsercionAgilNodos.

5.2 Clonación de un nodo

La clase XmlNode ("XmlNode Class", 2015) cuenta con el método CloneNode ("XmlNode.CloneNode Method", 2015) para crear una copia de un nodo. El parámetro de este método permite especificar si se copia el contenido anidado o no; para ello es necesario especificar true o false como argumento:

// Creación de un nuevo elemento a partir de uno existente:
producto = producto.CloneNode(true);

// Modificación de los valores del nodo recién clonado:
producto.Attributes[0].Value = "10002";
producto.ChildNodes[0].ChildNodes[0].Value = "Cappuccino";
producto.ChildNodes[1].ChildNodes[0].Value = "9500";

// Agrega el nuevo elemento:
productos.AppendChild(producto);

6. Práctica: Código C#

En primer lugar se escribe la clase AyudanteXml:

En las líneas 9-26 se especifica el método static AgregarElemento con los parámetros:
  • nodoPadre: referencia al nodo padre sobre el que se creará/agregará el nuevo nodo.
  • nombreEtiqueta: nombre para el nuevo nodo.
  • contenido: contenido textual para un nodo anidado al recién creado. (Opcional).
Más adelante -líneas 29-38-, se crea el método static AgregarAtributo para agregar un nuevo atributo al documento XML. Estos son sus parámetros:
  • nodoPadre: referencia al nodo padre sobre el que se creará el nuevo atributo.
  • nombreAtributo: nombre para el nuevo atributo.
  • contenido: contenido textual para el atributo recién creado.
Compilación:

csc /t:library AyudanteXml.cs

Las líneas de interés de este archivo son:
  • Líneas 22-25: crea un primer elemento y añade otros nodos y atributos usando los métodos AyudanteXml.AgregarElemento y AyudanteXml.AgregarAtributo. Estos operaciones se realizan para crear el producto con ID 10001.
  • Líneas 27-30: de manera análoga al caso anterior, estas líneas crean un producto con ID 10002.
Compilación: 

csc /t:exe /r:AyudanteXml.dll \InsercionAgilNodos.cs

Ejecución assembly:

.\InsercionAgilNodos.exe
Ejecución assembly InsercionAgilNodos.exe
Figura 1. Ejecución assembly InsercionAgilNodos.exe.

7. Conclusiones

Se comprendió el proceso de creación de una clase ayudante para agilizar el proceso de agregación de nodos y atributos a un documento XML. Es notable la diferencia respecto a la receta C# anterior: en este caso solo se requirió invocar los métodos de la clase ayudante en cuestión para especificar datos del nuevo elemento/atributo a crear en el documento XML. En la próxima receta C# se demostrará cómo buscar elementos en un documento XML a través de su nombre.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.
Receta C# No. 6-2: Inserción de Nodos en un Documento XML (2015, diciembre 3). Recuperado desde: http://ortizol.blogspot.com/2015/11/receta-csharp-no-6-2-insercion-de-nodos-en-un-documento-xml.html.
XmlDocument Class (System.Xml) (2015, diciembre 29). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx.
XmlNode Class (System.Xml) (2015, diciembre 29). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlnode(v=vs.110).aspx.
XmlNode.CloneNode Method (Boolean) (System.Xml) (2015, diciembre 3). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.clonenode(v=vs.110).aspx.


V

miércoles, 2 de diciembre de 2015

Cadenas de Caracteres y Manipulación de Texto en C# - Parte 4/5: Clase StringBuilder

Índice

1. Introducción
2. Palabras Clave
3. La Clase StringBuilder
4. StringBuilder vs. String
5. Asignación de Memoria en StringBuilder
6. Otros Métodos de StringBuilder
7. Aspectos Importantes de StringBuilder
8. Conclusiones
9. Literatura & Enlaces

1. Introducción

En artículos anteriores de la serie Cadenas de Caracteres y Manipulación de Texto en C# se ha expuesto los métodos de manipulación de cadenas de caracteres inmutables: objeto que representa una cadena de caracteres que no cambia durante el tiempo de ejecución. En esta parte se discute los objetos opuestos a los anteriores, es decir las cadenas de caracteres mutables. Esto se logra a través del uso de la clase System.Text.StringBuilder. Se estudia de este modo los mecanismos propios de esta clase para manipular cadenas de caracteres de forma más eficiente respecto a String.

2. Palabras Clave

  • Buffer
  • Cadena de caracteres
  • CLR
  • Eficiencia
  • Inmutabilidad
  • Memoria
  • Mutabilidad
  • Stack

3. La Clase StringBuilder


La clase StringBuilder ("StringBuilder Class", 2015) (namespace System.Text) está diseñada para representar cadenas de caracteres mutables, es decir que su contenido se puede editar (Albahari, 2012). Esta clase cuenta con 6 constructores que permiten inicializar un objeto con diferentes parámetros: capacidad, cuota de crecimiento, entre otros.
Constructores StringBuilder
Tabla 1. Constructores StringBuilder ("StringBuilder", 2015).
Suponiendo que se inicia un objeto de esta clase con la capacidad predeterminada -16 caracteres-, a medida que se añada más contenido -caracteres- al objeto StringBuilder, de forma automática se redimensiona su estructura interna para soportar la nueva demanda de capacidad ("StringBuilder Class", 2015). Este proceso de redimensionamiento demanda un coste bajo cómputo; e inclusive cuando alcanza su capacidad máxima. Esta capacidad máxima está determinada por el valor máximo de Int32.MaxValue ("Int32.MaxValue Field", 2015): 2.147.483.647 bytes.

4. StringBuilder vs. String

La clase String posee la misma característica de los tipos primitivos (o integrados): inmutabilidad. Suponiendo que se tiene la expresión

"Blog" + " xCSw"

con se esto se crea una nueva cadena -"BlogxCSw"- en la memoria stack de la CRL. La cuenta de objetos en la estructura stack sería de 2. Mientras que con StringBuilder:

// La variable blog hace referencia al objeto StringBuilder con la cadena "Blog":
StringBuilder nombreCompleto = new StringBuilder("John");

Hasta este punto en la stack existe un objeto en memoria. Continuando:

// Proceso de 'adición' de cadenas
nombreCompleto.Append(" xCSw");

A pesar de la adición de la nueva cadena -"xCSw"- en la estructura stack se mantiene el mismo número de objetos: 1.

Esta es una de las principales diferencias entre estos dos tipos de datos: el almacenamiento. Es evidente que StringBuilder es más eficiente respecto a este requerimiento; y lo es más aún cuando se trata de almacenar cadenas de longitud superiores.

5. Asignación de Memoria en StringBuilder

A través del siguiente ejemplo se puede visualizar cómo un objeto StringBuilder adapta su capacidad de almacenamiento de acuerdo al tamaño o número caracteres que se adicionan a lo largo de la ejecución del programa.

En las líneas 26-36 -método InformacionObjetoStringBuilder- se obtiene a través de reflection ("Receta No. 3-14 en C#", 2015) las propiedades de interés del objeto StringBuider. Para este caso:
  • Capacity
  • MaxCapacity y 
  • Length
El texto inicial del objeto StringBuilder es "Es esta es una frase." -línea 46-. Luego en el ciclo for -líneas 51-55- se invoca hasta 11 veces el método Append para adicionar la cadena "Texto adicional." ese mismo número de veces al objeto objSB. En ese mismo ciclo se invoca al método InformacionObjetoStringBuilder para consultar el estado de las tres propiedades mencionadas.

Al ejecutar este assembly se obtiene en la salida estándar (http://ideone.com/v7AJV4):

MaxCapacity: 2,147,483,647     Capacity: 16     Length: 0     
MaxCapacity: 2,147,483,647     Capacity: 21     Length: 21     
MaxCapacity: 2,147,483,647     Capacity: 42     Length: 37     
MaxCapacity: 2,147,483,647     Capacity: 84     Length: 53     
MaxCapacity: 2,147,483,647     Capacity: 84     Length: 69     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 85     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 101     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 117     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 133     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 149     
MaxCapacity: 2,147,483,647     Capacity: 168     Length: 165     
MaxCapacity: 2,147,483,647     Capacity: 336     Length: 181     
MaxCapacity: 2,147,483,647     Capacity: 336     Length: 197

En la primera parte -MaxCapacity- se muestra la capacidad máxima soportada por el objeto StringBuilder: Int32.MaxValue. Enseguida, la capacidad actual del objeto en la propiedad Capacity. Finalmente, con Length el tamaño actual de la cadena de caracteres localizada en el objeto StringBuilder -objSB-.

6. Otros Métodos de StringBuilder

Además del método Append, la clase StringBuilder cuenta con AppendLine ("StringBuilder.AppendLine", 2015") para adicionar una nueva línea de texto:

StringBuilder sb = new StringBuilder("Blog xCSw");
sb.AppendLine();

Por otra parte, con el método AppendFormat ("StringBuilder.AppendFormat", 2015) se adiciona una cadena de caracteres con formato:

StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0} {1}", "Blog", "xCSw");

Existen otros métodos para manipular la cadena de caracteres que representa un objeto StringBuilder; entre esos métodos se puede contar:
  • Insert: para insertar valores de tipos de datos en una posición de la cadena de caracteres de StringBuilder.
  • Remove: para remover una rango de caracteres.
  • Replace: Reemplaza las ocurrencias de un carácter o una cadena de caracteres en la cadena de caracteres de StringBuilder.

7. Aspectos Importantes de StringBuilder

Otras consideraciones importantes a la hora de usar objetos de la clase StringBuilder (Albahari, 2012):
  • Al establecer la propiedad Capacity con una capacidad inferior a la de Length, la primera lanza la excepción: System.ArgumentOutOfRangeException.
  • La capacidad máxima de un objeto StringBuilder alcanza los 2 gigabytes.
  • Si se estable un valor inferior a la longitud actual -propiedad Length- de la cadena en el objeto StringBuilder, entonces su contenido es truncado al nuevo valor inferior al actual.
  • Al establecer un valor superior al de la propiedad Length, el buffer llena esos espacios vacíos con caracteres de espacio.

8. Conclusiones

Se ha estudiado la clase StringBuilder para entender cómo se pueden construir cadenas de caracteres mutables. Gracias a esta propiedad, el programador puede manipular texto en cualquiera de los lenguajes compatibles con la CLR. La amplia capacidad de StringBuilder -2GB- además de resultar apta para textos grandes es mucho más eficiente que la manipulación de cadenas de caracteres con String. En el próximo, y último, artículo de la serie Cadenas de Caracteres y Manipulación de Texto en C# se estudiará codificación de texto.

9. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
StringBuilder Class (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder(v=vs.110).aspx.
Int32.MaxValue Field (System) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.int32.maxvalue(v=vs.110).aspx.
Receta No. 3-14 en C#: Investigar los Atributos de un Elemento de Programa con Reflection (2015, diciembre 2). Recuperado desde: http://ortizol.blogspot.com/2014/06/receta-no-3-14-en-csharp-investigar-los-atributos-de-un-elemento-de-program-con-reflection.html.
StringBuilder.AppendLine Method (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.appendline(v=vs.110).aspx.
StringBuilder.AppendFormat Method (System.Text) (2015, diciembre 2). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.text.stringbuilder.appendformat(v=vs.110).aspx.


V

sábado, 28 de noviembre de 2015

Cadenas de Caracteres y Manipulación de Texto en C# - Parte 2/5: String

Índice

1. Introducción
2. Palabras Clave
3. El Tipo de Dato por Referencia String
4. Generación y Construcción de Cadenas de Caracteres
5. Uso de Cadenas Vacías y null
6. Acceso a Caracteres Individuales
7. Búsqueda de Caracteres
8. Manipulación de Cadenas de Caracteres
9. Particionar y Unir Cadenas de Caracteres
10. Formato de Cadenas de Caracteres
11. Conclusiones
12. Literatura & Enlaces

1. Introducción

En esta segunda parte de la serie de artículos dedicados a cadenas de caracteres y manipulación de texto en C# se explica varias de las operaciones fundamentales del tipo de dato por referencia String. Temas importantes a estudiar: generación y construcción de cadenas de caracteres, cadenas vacías y null, acceso a caracteres individuales en una cadena de caracteres, búsqueda de caracteres, manipulación y particionamiento de cadenas de caracteres, y composición con formato de cadenas caracteres. Como es habitual, se introducirán ejemplos prácticos que demuestren estas capacidades inherentes en el lenguaje de programación C#. Estas mismas capacidades también se ofrecen en otros lenguajes compatible con .NET: VB.NET, C++, F#, entre otros.

2. Palabras Clave

  • .NET
  • Búsqueda
  • Cadena de caracteres
  • Carácter
  • Elemento de formato
  • Formato
  • Lenguaje de programación
  • Particionar
  • Sobrecarga

3. El Tipo de Dato por Referencia String

El tipo de dato por referencia String ("String Class", 2015) representa un grupo de caracteres de la codificación Unicode ("Unicode", 2015). Cuenta con el alias u homónimo string que cumple las mismas funciones aunque con algunas sutiles diferencias sintácticas e importación de nombres de espacio. (Se recomienda la lectura del artículo Pregunta C# (3 de 20): ¿Cuál es la Diferencia entre String y string? para saber más de sus diferencias y similitudes).

Esta clase cuenta con una serie de métodos para llevar a cabo tareas como:
  • Generación y construcción de cadenas de caracteres, 
  • Uso de cadenas vacías y null
  • Acceso a caracteres individuales, 
  • Búsqueda de caracteres, 
  • Manipulación y particionamiento de cadenas de caracteres, y 
  • Composición de cadenas de caracteres usando formato.

4. Generación y Construcción de Cadenas de Caracteres

Un objeto String puede ser compuesto a partir de una literal que represente una serie de caracteres Unicode. Ejemplo básicos de composición:

string cadena1 = "Blog xCSw";
string cadena2 = "Blog xCSw\http://ortizol.blogspot.com";
string cadena3 = "C" + "#";
string cadena4 = @"\\carpeta\\compartida\\Persona.cs";


Además, también es posible construir una cadena de caracteres usando cualquier de los constructores de la clase ("String Class", 2015):
Constructores de String
Tabla 1. Constructores de String ("String Class", 2015).
Si se desea construir una cadena que repita n veces un carácter en particular, se puede usar el tercer constructor -String(Char, Int32)-, así:

Console.WriteLine( new String ('#', 12)); // ############

De manera análoga, se puede recurrir al constructor String(Char[]) para componer una cadena de caracteres a partir de un arreglo de objetos Char:

char[] arregloCaracteres = "Blog xCSw".ToCharArray();
String cadena = new String (arregloCaracteres); // cadena = "Blog xCSw";

5. Uso de Cadenas Vacías y null

Es posible construir una cadena vacía usando alguno de estos dos métodos:
  • El literal de cadena vacía "", o 
  • Invocar el campo Empty ("String.Empty Field", 2015).
String cadenaVacia1 = "";
String cadenaVacia2 = String.Empty;

Ambas expresiones anteriores generarán una cadena vacía.

Para validar que una cadena de caracteres es vacía, se puede proceder con cualquier de estas expresiones:

Console.WriteLine (cadenaVacia1 == ""); // True
Console.WriteLine (cadenaVacia2 == String.Empty); // True
Console.WriteLine (cadenaVacia1.Length == 0); // True

Por otra parte, debido a que el tipo de dato String (o su alias string) es de tipo por referencia (Tipos por Valor vs. Tipos por Referencia), es importante considerar expresiones donde null puede estar asignado en una variable de este tipo de dato:

String nuevaCadena = null;
Console.WriteLine (nuevaCadena == null); // True
Console.WriteLine (nuevaCadena == ""); // False
Console.WriteLine (nuevaCadena.Length == 0); // Genera la excepción NullReferenceException

El hecho de intentar acceder a una función -en este caso una propiedad-, de una cadena inicializada en null genera la excepción NullReferenceException ("NullReferenceException Class", 2015).

Como se explica en Albahari (2012), a través del método String.IsNullOrEmpty ("String.IsNullOrEmpty Method", 2015) se puede validar si una cadena es null o vacía.

Console.WriteLine(!String.IsNullOrEmpty(nuevaCadena)?nuevaCadena.Length : "Cadena vacía o nula");

6. Acceso a Caracteres Individuales

Para acceder a un carácter individual de una cadena de caracteres es necesario usar el indizador (Indizadores en C#) implícito de String. Ejemplo básico de uso:

String blog = "Blog xCSw";
char caracterX = blog[5]; // caracterX == 'x'

En la sintaxis de la declaración de la clase String, se halla que ésta ("String Class", 2015) implementa la interfaz IEnumerable ("IEnumerable Interface", 2015):
Declaración clase String
Figura 1. Declaración clase String ("String Class", 2015).
Esto quiere decir que, por ejemplo, la iteración -enumeración- de cada elemento -carácter-, se puede llevar a cabo con el ciclo foreach:

foreach(char caracter in "xCSw")
{
Console.Write (caracter + " ") // x C S w
}

7. Búsqueda de Caracteres

La clase String cuenta con varios métodos para la búsqueda de caracteres en una cadena de caracteres. Principalmente se puede mencionar estos:
  • Contains
  • EndsWith y 
  • StartsWith
El tipo de retorno de cada uno de estos métodos es bool. Esto quiere decir que si la cadena en cuestión contiene el o los caracteres especificados como clave de búsqueda, retornará true.

Algunos ejemplos básicos de uso:

Console.WriteLine ("Blog xCSw".Contains ("CS")); // True
Console.WriteLine ("Blog xCSw".EndsWith ("sw")); // False

Alternativamente, en String se cuenta con el método IndexOf. Con este método se obtiene la primera posición de la ocurrencia encontrado en la cadena de caracteres objetivo. Un ejemplo básico y práctico podría ser:

Console.WriteLine ("Blog xCSw".IndexOf ("CS")); // 5

Con 

Console.WriteLine ("Blog xCSw".IndexOf ("sw")); // -1

en cambio se retorna el valor entero -1. Esto es así cuando no se ha podido encontrar la cadena especificada -i.e."sw"-.


Otro método interesante de búsqueda de caracteres es IndexOfAny. Este método retorna el índice de la primera ocurrencia de uno de los caracteres de búsqueda. Se puede considerar este ejemplo para ampliar su comprensión:


Console.WriteLine ("mvp .NET".IndexOfAny (new char[] {' ', 'p'})); // 2
Console.WriteLine ("jf.ortiz43@outlook.com".IndexOfAny ("0123456789")); // 8

8. Manipulación de Cadenas de Caracteres

En la receta Receta No. 2-1 en C#: Manipular el Contenido de una Cadena Texto Eficientemente se explica con detalle acerca de la naturaleza inmutable de los objetos declarados como String. La manipulación de una cadena de caracteres genera una nueva, dejando la original intacta. En consecuencia, los métodos que se discuten a continuación siguen esa misma propiedad de inmutabilidad.


Con el método Substring se extrae un conjunto de caracteres por medio de la especificación de un rango basado en índice 0. Para demostrarlo se escriben los siguientes ejemplos en código fuente C#:

String subcadena1 = "abcde".Substring (0, 2); // subcadena1 = "abc"
String subcadena2 = "abcde".Substring (1, 4); // subcadena2 = "bcde"


Este método posee la versión sobrecargada que sólo requiere un solo parámetro con el que se indica el inicio de extracción:

String subcadena3 = "abcde".Substring (2); // subcadena = "cde"


Otros métodos interesantes para manipulación de cadenas de caracteres son Insert y Remove. Con estos métodos se inserta o se remueve uno o más caracteres a en una posición determinada de una cadena de caracteres:

String insercion = "BlogxCSw".Insert (4, " "); // insercion = "Blog xCSw"
String remocion = insercion.Remove (4, " "); // remocion = "BlogxCSw";


Por otro lado, con PadLeft y Padright se puede alinear una cadena de caracteres a determinado número de caracteres a izquierda o derecha, respectivamente. En el alineamiento se puede usar un carácter de relleno; en caso de no especificarse ningún carácter, se usará el carácter de espacio:

Console.WriteLine ("CSharp".PadLeft (9, '#')); // ###CSharp


Trim es un método útil para la remoción espacios en blanco de una cadena de caracteres, al inicio o al final:

Console.WriteLine ("\t .NET \t\r\n ".Trim().Lenght); // 4


Finalmente, con el método Replace se reemplaza una cadena de caracteres por otra:

Console.WriteLine ("Microsoft-.NET-Framework".Replace ("-", " "); // Microsoft .NET Framework

9. Particionar y Unir Cadenas de Caracteres

Con el método Split se puede particionar una cadena de caracteres así:

String[] palabras = "Microsoft .NET Framework".Split();

foreach(String palabra in palabras)
{
Console.Write (palabra + ","); // Mirosoft,.NET,Framework,
}


Es evidente que Split particiona la cadena original usando los espacios en blancos de ésta. Sin embargo, cuenta con otros métodos sobrecargados para refinar el particionamiento:
Métodos sobrecargados Split
Tabla 2. Métodos sobrecargados Split ("String.Split", 2015).

El método opuesto es Join. Con Join es posible hacer lo siguiente:

String[] palabras = "Microsoft .NET Framework".Split();
String dotNet = String.Join (" ", palabras); // Microsoft .NET Framework


Finalmente, con Concat se concatena un conjunto de cadenas de caracteres, así:

String concatenacion = String.Concat ("Microsoft", ".NET", "Framework");


O equivalentemente con:

String nuevaCadena = "Microsoft" + ".NET" + "Framework";

10. Formato de Cadenas de Caracteres

A través del método static Format se puede especificar el formato de una cadena de caracteres. Esto es posible con la especificación de un elementos de formato. Los elementos de formato son cadenas especiales encerradas entre llaves -{ (corchete de apertura), } (corchete de cierre)- que indican el formato de una cadena de caracteres:

String cadenaCompuesta = "{0} es la capital de {1}.";
String nuevaCadena = String.Format(cadenaCompuesta, "Bogotá", "Colombia");

Cuando se imprima en la salida estándar el contenido de la variable nuevaCadena se obtendrá:

"Bogotá es la capital de Colombia."

(En "Custom Numeric Format" (2015) hay una lista de elementos de formato más extendida y con varios ejemplos prácticos).

11. Conclusiones

Se exploró varios de los métodos útiles para la manipulación, formato, búsqueda, acceso a caracteres individuales, particionamiento y unión de cadenas de caracteres. Saber y tener conocimiento práctico de los métodos discutidos amplía la capacidad de creación de programas informáticos más sofisticados y robustos. Vale mencionar, además, que se puede ampliar y profundizar en el conocimiento en cada uno de los puntos tratados; esto con el propósito de elaborar software capaz de cumplir con requerimientos más avanzados de diferentes ámbitos: comercial, científico, académico, etc. El próximo artículo estará orientado a conocer criterios de comparación de cadenas de caracteres y variación regional.

12. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
String Class (System) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx.
Unicode (2015, noviembre 28). Recuperado desde: https://en.wikipedia.org/wiki/Unicode.
Pregunta C# (3 de 20): ¿Cuál es la Diferencia entre String y string? (2015, noviembre 28). Recuperado desde: http://ortizol.blogspot.com.co/2014/07/pregunta-csharp-3-de-20-cual-es-la-diferencia-entre-string-y-string.html.
String.Empty Field (System) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.string.empty(v=vs.110).aspx.
Tipos por Valor vs. Tipos por Referencia (2015, noviembre 28). Recuperado desde: http://ortizol.blogspot.com/2013/07/tipos-por-valor-vs-tipos-por-referencia.html.
NullReferenceException Class (System) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.nullreferenceexception(v=vs.110).aspx.
String.IsNullOrEmpty Method (String) (System) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.string.isnullorempty(v=vs.110).aspx.
Indizadores en C# (2015, noviembre 28). Recuperado desde; http://ortizol.blogspot.com.co/2013/10/tabla-de-contenido-0_14.html.
IEnumerable Interface (System.Collections) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx.
Receta No. 2-1 en C#: Manipular el Contenido de una Cadena Texto Eficientemente (2015, noviembre 28). Recuperado desde: http://ortizol.blogspot.com/2014/04/receta-no-2-1-en-c-manipular-el.html.
String.Split Method (System) (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx.
Custom Numeric Format Strings (2015, noviembre 28). Recuperado desde: https://msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx.


V