Partager via


Créer de nouvelles chaînes dans .NET

.NET permet de créer des chaînes à l’aide d’une affectation simple, et surcharge également un constructeur de classe pour prendre en charge la création de chaînes à l’aide d’un certain nombre de paramètres différents. .NET fournit également plusieurs méthodes dans la System.String classe qui créent des objets de chaîne en combinant plusieurs chaînes, tableaux de chaînes ou objets.

Créer des chaînes à l’aide de l’affectation

La façon la plus simple de créer un objet String est simplement d'attribuer une chaîne littérale à un objet String.

Créer des chaînes à l’aide d’un constructeur de classe

Vous pouvez utiliser les surcharges du constructeur de classe String pour créer des chaînes à partir de tableaux de caractères. Vous pouvez également créer une nouvelle chaîne en dupliquant un caractère particulier un nombre spécifié de fois. La String(ReadOnlySpan<Char>) surcharge du constructeur accepte un ReadOnlySpan<T> ou une pile allouée Span<T> de caractères et évite d’allouer un tableau de caractères intermédiaire sur le tas managé lorsque vous générez de petites chaînes d’une taille connue, bien que l’instance de chaîne résultante soit toujours allouée sur le tas managé.

Méthodes qui renvoient des chaînes de caractères

Le tableau suivant répertorie plusieurs méthodes utiles qui renvoient de nouveaux objets de chaîne.

Nom de la méthode Utiliser
String.Format Crée une chaîne formatée à partir d’un ensemble d’objets d’entrée.
String.Concat Construit des chaînes à partir de deux chaînes ou plus.
String.Join Crée une nouvelle chaîne en combinant un tableau de chaînes.
String.Insert Crée une nouvelle chaîne en insérant une chaîne dans l’index spécifié d’une chaîne existante.
String.CopyTo Copie les caractères spécifiés d’une chaîne dans une position spécifiée dans un tableau de caractères.
String.Create Crée une nouvelle chaîne d’une longueur spécifiée, en remplissant des caractères via un rappel qui reçoit un Span<T> modifiable et un objet d’état fourni par l’appelant.

String.Format

Vous pouvez utiliser cette String.Format méthode pour créer des chaînes formatées et concaténer des chaînes représentant plusieurs objets. Cette méthode convertit automatiquement tout objet passé en une chaîne. Par exemple, si votre application doit afficher une Int32 valeur et une DateTime valeur pour l’utilisateur, vous pouvez facilement construire une chaîne pour représenter ces valeurs à l’aide de la Format méthode. Pour plus d’informations sur les conventions de formatage utilisées avec cette méthode, consultez la section sur le formatage composite.

L’exemple suivant utilise la Format méthode pour créer une chaîne qui utilise une variable entière.

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.

Dans cet exemple, DateTime.Now affiche la date et l’heure actuelles d’une manière spécifiée par la culture associée au thread actuel.

String.Concat

Cette String.Concat méthode permet de créer facilement un objet chaîne à partir de deux objets existants ou plus. Il fournit un moyen indépendant de la langue de concaténer des chaînes. Cette méthode accepte toute classe dérivée de System.Object. L’exemple suivant crée une chaîne à partir de deux objets de chaîne existants et d’un caractère de séparation.

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

La String.Join méthode crée une nouvelle chaîne à partir d’un tableau de chaînes et d’une chaîne de séparation. Cette méthode est utile si vous souhaitez concaténer plusieurs chaînes ensemble, en faisant une liste peut-être séparée par une virgule.

L’exemple suivant utilise un espace pour lier un tableau de chaînes.

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

La String.Insert méthode crée une nouvelle chaîne en insérant une chaîne dans une position spécifiée dans une autre chaîne. Cette méthode utilise un indice de base zéro. L’exemple suivant insère une chaîne dans la cinquième position d’index de MyString et crée une nouvelle chaîne avec cette valeur.

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

La String.CopyTo méthode copie des parties d’une chaîne dans un tableau de caractères. Vous pouvez spécifier à la fois l’index de début de la chaîne et le nombre de caractères à copier. Cette méthode prend l’index source, un tableau de caractères, l’index de destination et le nombre de caractères à copier. Tous les index sont basés sur zéro.

L’exemple suivant utilise la CopyTo méthode permettant de copier les caractères du mot « Hello » à partir d’un objet chaîne vers la première position d’index d’un tableau de caractères.

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

La String.Create méthode vous permet de remplir par programmation les caractères d’une nouvelle chaîne à l’aide d’un rappel. Le rappel reçoit un Span<T> modifiable de caractères et un objet d'état fourni par l'appelant, ce qui vous permet de composer le contenu de la chaîne sans allouer de tampons de caractères intermédiaires. Le rappel lui-même peut toujours allouer, par exemple s’il capture des variables locales ou appelle d’autres API gourmandes en allocation.

L’exemple suivant utilise String.Create pour générer une chaîne à cinq caractères à partir de caractères alphabétiques consécutifs :

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 conçu pour les scénarios sensibles aux performances où vous connaissez la longueur de chaîne finale à l’avance et souhaitez éviter d’allouer des mémoires tampons de caractères intermédiaires. Le runtime alloue une nouvelle chaîne, transmet directement sa mémoire tampon de stockage à votre fonction de rappel en tant que paramètre Span<char>, et retourne la chaîne immuable une fois la fonction de rappel exécutée. Aucune copie des données ne se produit une fois le rappel terminé.

String.Create et new String(Span<char>)

Une autre option permettant de créer efficacement des chaînes consiste à allouer un buffer de caractères avec stackalloc, à la remplir, puis la passer au constructeur :

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

Les deux approches allouent la chaîne finale exactement une seule fois. Les différences clés sont :

  • stackalloc + new string(span) place la mémoire tampon de travail sur la pile. Cela est le plus rapide pour les mémoires tampons de petite taille fixe , mais la pile est une ressource finie ; les allocations volumineuses ou profondément imbriquées peuvent provoquer un StackOverflowException. Cet exemple montre le modèle C# stackalloc ; Visual Basic ne prend pas en charge stackalloc, mais il peut toujours appeler le String(ReadOnlySpan<char>) constructeur lorsque vous avez un ReadOnlySpan<char>.
  • String.Create alloue le buffer de travail sur le tas dans le cadre de l’objet de chaîne lui-même ; il n’y a donc aucune pression sur la pile. Il accepte également un paramètre d'état typé que le runtime passe à votre rappel sans encapsulation, évitant ainsi les allocations de mémoire lorsque l'état est un type référence ou une structure non capturée. En général, préférez stackalloc + new String(span) les petites chaînes (généralement moins de quelques centaines de caractères) avec une taille limitée connue. Utilisez String.Create quand la taille peut être grande, lorsque vous souhaitez éviter la pression de la pile ou lors du passage de l’état dans le rappel sans boxing.

Voir aussi