Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
.NET permite crear cadenas mediante una asignación sencilla y también sobrecarga un constructor de clase para admitir la creación de cadenas mediante varios parámetros diferentes. .NET también proporciona varios métodos en la System.String clase que crean nuevos objetos de cadena mediante la combinación de varias cadenas, matrices de cadenas o objetos.
Creación de cadenas mediante la asignación
La manera más fácil de crear un nuevo String objeto es simplemente asignar un literal de cadena a un String objeto.
Creación de cadenas mediante un constructor de clases
Puede usar sobrecargas del String constructor de clases para crear cadenas a partir de matrices de caracteres. También puede crear una nueva cadena duplicando un carácter determinado un número especificado de veces. La sobrecarga del String(ReadOnlySpan<Char>) acepta un ReadOnlySpan<T> o un Span<T> asignado en la pila de caracteres y evita asignar una matriz de caracteres intermedia en el montón administrado al construir cadenas pequeñas de tamaño conocido, aunque la instancia de cadena resultante todavía está asignada en el montón administrado.
Métodos que devuelven cadenas
En la tabla siguiente se enumeran varios métodos útiles que devuelven nuevos objetos de cadena.
| Nombre del método | Uso |
|---|---|
| String.Format | Crea una cadena con formato a partir de un conjunto de objetos de entrada. |
| String.Concat | Compila cadenas a partir de dos o más cadenas. |
| String.Join | Crea una nueva cadena combinando una matriz de cadenas. |
| String.Insert | Crea una nueva cadena insertando una cadena en el índice especificado de una cadena existente. |
| String.CopyTo | Copia los caracteres especificados en una cadena en una posición especificada en una matriz de caracteres. |
| String.Create | Crea una nueva cadena de una longitud especificada, rellenando los caracteres a través de una devolución de llamada que recibe un Span<T> para escribir y un objeto de estado proporcionado por el autor de la llamada. |
String.Format
Puede usar el String.Format método para crear cadenas con formato y concatenar cadenas que representan varios objetos. Este método convierte automáticamente cualquier objeto pasado en una cadena. Por ejemplo, si la aplicación debe mostrar un Int32 valor y un DateTime valor al usuario, puede construir fácilmente una cadena para representar estos valores mediante el Format método . Para obtener información sobre las convenciones de formato usadas con este método, consulte la sección sobre el formato compuesto.
En el ejemplo siguiente se usa el Format método para crear una cadena que usa una variable de entero.
int numberOfFleas = 12;
string miscInfo = String.Format("Your dog has {0} fleas. " +
"It is time to get a flea collar. " +
"The current universal date is: {1:u}.",
numberOfFleas, DateTime.Now);
Console.WriteLine(miscInfo);
// The example displays the following output:
// Your dog has 12 fleas. It is time to get a flea collar.
// The current universal date is: 2008-03-28 13:31:40Z.
Dim numberOfFleas As Integer = 12
Dim miscInfo As String = String.Format("Your dog has {0} fleas. " & _
"It is time to get a flea collar. " & _
"The current universal date is: {1:u}.", _
numberOfFleas, Date.Now)
Console.WriteLine(miscInfo)
' The example displays the following output:
' Your dog has 12 fleas. It is time to get a flea collar.
' The current universal date is: 2008-03-28 13:31:40Z.
En este ejemplo, DateTime.Now muestra la fecha y hora actuales de una manera especificada por la referencia cultural asociada al subproceso actual.
String.Concat
El String.Concat método se puede usar para crear fácilmente un nuevo objeto de cadena a partir de dos o más objetos existentes. Proporciona una manera independiente del lenguaje de concatenar cadenas. Este método acepta cualquier clase que derive de System.Object. En el ejemplo siguiente se crea una cadena a partir de dos objetos de cadena existentes y un carácter de separación.
string helloString1 = "Hello";
string helloString2 = "World!";
Console.WriteLine(String.Concat(helloString1, ' ', helloString2));
// The example displays the following output:
// Hello World!
Dim helloString1 As String = "Hello"
Dim helloString2 As String = "World!"
Console.WriteLine(String.Concat(helloString1, " "c, helloString2))
' The example displays the following output:
' Hello World!
String.Join
El String.Join método crea una nueva cadena a partir de una matriz de cadenas y una cadena separadora. Este método es útil si desea concatenar varias cadenas juntas, haciendo una lista tal vez separada por una coma.
En el ejemplo siguiente se usa un espacio para enlazar una matriz de cadenas.
string[] words = {"Hello", "and", "welcome", "to", "my" , "world!"};
Console.WriteLine(String.Join(" ", words));
// The example displays the following output:
// Hello and welcome to my world!
Dim words() As String = {"Hello", "and", "welcome", "to", "my", "world!"}
Console.WriteLine(String.Join(" ", words))
' The example displays the following output:
' Hello and welcome to my world!
String.Insert
El String.Insert método crea una nueva cadena insertando una cadena en una posición especificada en otra cadena. Este método usa un índice de base cero. En el ejemplo siguiente se inserta una cadena en la quinta posición de índice de MyString y se crea una nueva cadena con este valor.
string sentence = "Once a time.";
Console.WriteLine(sentence.Insert(4, " upon"));
// The example displays the following output:
// Once upon a time.
Dim sentence As String = "Once a time."
Console.WriteLine(sentence.Insert(4, " upon"))
' The example displays the following output:
' Once upon a time.
String.CopyTo
El String.CopyTo método copia partes de una cadena en una matriz de caracteres. Puede especificar el índice inicial de la cadena y el número de caracteres que se van a copiar. Este método toma el índice de origen, una matriz de caracteres, el índice de destino y el número de caracteres que se van a copiar. Todos los índices se basan en cero.
En el ejemplo siguiente se usa el CopyTo método para copiar los caracteres de la palabra "Hello" de un objeto de cadena a la primera posición de índice de una matriz de caracteres.
string greeting = "Hello World!";
char[] charArray = {'W','h','e','r','e'};
Console.WriteLine($"The original character array: {new string(charArray)}");
greeting.CopyTo(0, charArray,0 ,5);
Console.WriteLine($"The new character array: {new string(charArray)}");
// The example displays the following output:
// The original character array: Where
// The new character array: Hello
Dim greeting As String = "Hello World!"
Dim charArray() As Char = {"W"c, "h"c, "e"c, "r"c, "e"c}
Console.WriteLine("The original character array: {0}", New String(charArray))
greeting.CopyTo(0, charArray, 0, 5)
Console.WriteLine("The new character array: {0}", New String(charArray))
' The example displays the following output:
' The original character array: Where
' The new character array: Hello
String.Create
El método String.Create permite programar el rellenado de los caracteres de una nueva cadena mediante una devolución de llamada. La devolución de llamada recibe un Span<T> escribible de caracteres y un objeto de estado proporcionado por quien llama, de modo que puede construir el contenido de la cadena sin asignar búferes de caracteres intermedios. La callback en sí misma podría seguir asignando, por ejemplo, si captura variables locales o llama a otras API con alto uso de memoria.
En el ejemplo siguiente se usa String.Create para crear una cadena de cinco caracteres a partir de caracteres alfabéticos consecutivos:
string result = string.Create(5, 'a', (span, firstChar) =>
{
for (int i = 0; i < span.Length; i++)
{
span[i] = (char)(firstChar + i);
}
});
Console.WriteLine(result); // abcde
Module Program
Sub Main()
Dim result As String = String.Create(5, "a"c, Sub(span, firstChar)
For i As Integer = 0 To span.Length - 1
span(i) = ChrW(AscW(firstChar) + i)
Next
End Sub)
Console.WriteLine(result) ' abcde
End Sub
End Module
String.Create está diseñado para escenarios sensibles al rendimiento en los que conoce la longitud final de la cadena de antemano y desea evitar asignar búferes de caracteres intermedios. El entorno de ejecución asigna una nueva cadena, pasa su búfer de respaldo directamente a la devolución de llamada como Span<char>, y devuelve la cadena inmutable una vez que la devolución de llamada ha finalizado. No se produce ninguna copia de los datos después de que se complete el callback.
String.Create frente a new String(Span<char>)
Otra opción para compilar cadenas de forma eficaz es asignar un búfer de caracteres con stackalloc, rellenarlo y pasarlo al String(ReadOnlySpan<char>) constructor:
static string CreateStringFromSpan()
{
Span<char> span = stackalloc char[5];
for (int i = 0; i < 5; i++)
{
span[i] = (char)('a' + i);
}
return new string(span);
}
Console.WriteLine(CreateStringFromSpan()); // abcde
Ambos enfoques asignan la cadena de texto final exactamente una vez. Las diferencias clave son:
-
stackalloc+new string(span)coloca el búfer de trabajo en la pila. Esto es más rápido para búferes pequeños de tamaño fijo, pero la pila es un recurso finito; las asignaciones grandes o profundamente anidadas pueden provocar unStackOverflowException. En este ejemplo se muestra el patrón de C#stackalloc; Visual Basic no admitestackalloc, pero todavía puede llamar al constructorString(ReadOnlySpan<char>)cuando tiene unReadOnlySpan<char>. -
String.Createasigna el búfer de trabajo en el montón como parte del propio objeto de cadena, por lo que no hay ninguna presión de pila. También acepta un parámetro de estado tipado que el tiempo de ejecución pasa a la devolución de llamada sin usar boxing, evitando las asignaciones de boxing cuando el estado es un tipo de referencia o una estructura que no se captura. En general, se prefierestackalloc+new String(span)para cadenas pequeñas (normalmente menos de unos cientos de caracteres) con un tamaño limitado conocido. UseString.Createcuando el tamaño pueda ser grande, cuando desea evitar la presión en la pila o al pasar el estado a la devolución de llamada sin encapsulación.