Chaînes
Mise à jour : novembre 2007
Une chaîne C# est un groupe d'un ou de plusieurs caractères déclarés à l'aide du mot clé string, qui est un raccourci du langage C# pour la classe System.String. Les chaînes en C# sont beaucoup plus faciles à utiliser, et sont beaucoup moins sujettes aux erreurs de programmation, que les tableaux de caractères en C ou C++.
Un littéral de chaîne se déclare entre guillemets, comme dans l'exemple suivant :
string greeting = "Hello, World!";
Vous pouvez extraire des sous-chaînes et concaténer des chaînes, comme ceci :
string s1 = "A string is more ";
string s2 = "than the sum of its chars.";
// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;
System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.
Les objets chaîne sont immuables dans le sens où ils ne peuvent pas être modifiés une fois créés. Les méthodes qui agissent sur les chaînes retournent en réalité de nouveaux objets chaîne. Par conséquent, pour des raisons de performances, il sera préférable d'utiliser la classe StringBuilder pour de larges volumes de concaténation ou d'autres traitements de chaînes impliqués, comme le montrent les exemples de code ci-dessous.
Utilisation de chaînes
Caractères d'échappement
Les caractères d'échappement, tels que "\n" (retour à la ligne) et "\t" (tabulation), peuvent être inclus dans des chaînes. La ligne :
string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1 Column 2 Column 3
string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
Row 1
Row 2
Row 3
*/
string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge
est identique à celle-ci :
Hello
World!
Si vous souhaitez inclure une barre oblique inverse, elle doit être précédée d'une autre barre oblique inverse. La chaîne suivante :
string filePath = @"C:\Users\scoleridge\Documents\";
//Output: C:\Users\scoleridge\Documents\
string text = @"My pensive SARA ! thy soft cheek reclined
Thus on mine arm, most soothing sweet it is
To sit beside our Cot,...";
/* Output:
My pensive SARA ! thy soft cheek reclined
Thus on mine arm, most soothing sweet it is
To sit beside our Cot,...
*/
string quote = @"Her name was ""Sara.""";
//Output: Her name was "Sara."
est en réalité identique à celle-ci :
\\My Documents\
Symbole @
Le symbole @ spécifie que les caractères d'échappement et sauts de ligne doivent être ignorés lorsque la chaîne est créée. Les deux chaînes suivantes sont donc identiques :
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";
ToString()
Les types de données intégrées C# fournissent tous la méthode ToString, qui convertit une valeur en chaîne. Cette méthode peut servir à convertir des valeurs numériques en chaînes, comme ceci :
int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg); // outputs "Eve was born in 1999"
Accès à des caractères
Il est possible d'accéder à des caractères contenus dans une chaîne à l'aide de méthodes, telles que Substring, Replace, Split et Trim.
string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"
System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"
// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7
Il est également possible de copier les caractères dans un tableau de caractères, comme ceci :
string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);
for (int j = 0; j < sb.Length; j++)
{
if (System.Char.IsLower(sb[j]) == true)
sb[j] = System.Char.ToUpper(sb[j]);
else if (System.Char.IsUpper(sb[j]) == true)
sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?
Il est possible d'accéder aux caractères d'une chaîne avec un index, de la façon suivante :
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
{
System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"
Changement de casse
Pour modifier la casse des lettres d'une chaîne, utilisez ToUpper() ou ToLower(), comme ceci :
string s6 = "Battle of Hastings, 1066";
System.Console.WriteLine(s6.ToUpper());
// outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower());
// outputs "battle of hastings 1066"
Comparaisons
La meilleure façon de comparer deux chaînes non traduites est d'utiliser la méthode Equals avec StringComparison.Ordinal et StringComparison.OrdinalIgnoreCase.
// Internal strings that will never be localized.
string root = @"C:\users";
string root2 = @"C:\Users";
// Use the overload of the Equals method that specifies a StringComparison.
// Ordinal is the fastest way to compare two strings.
bool result = root.Equals(root2, StringComparison.Ordinal);
Console.WriteLine("Ordinal comparison: {0} and {1} are {2}", root, root2,
result ? "equal." : "not equal.");
// To ignore case means "user" equals "User". This is the same as using
// String.ToUpperInvariant on each string and then performing an ordinal comparison.
result = root.Equals(root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine("Ordinal ignore case: {0} and {1} are {2}", root, root2,
result ? "equal." : "not equal.");
// A static method is also available.
bool areEqual = String.Equals(root, root2, StringComparison.Ordinal);
// String interning. Are these really two distinct objects?
string a = "The computer ate my source code.";
string b = "The computer ate my source code.";
// ReferenceEquals returns true if both objects
// point to the same location in memory.
if (String.ReferenceEquals(a, b))
Console.WriteLine("a and b are interned.");
else
Console.WriteLine("a and b are not interned.");
// Use String.Copy method to avoid interning.
string c = String.Copy(a);
if (String.ReferenceEquals(a, c))
Console.WriteLine("a and c are interned.");
else
Console.WriteLine("a and c are not interned.");
Les objets chaîne ont également une méthode CompareTo() qui retourne une valeur entière selon qu'une chaîne est inférieure (<) ou supérieure (>) à une autre. Pour comparer les chaînes, la valeur Unicode est utilisée. Les minuscules ont une plus petite valeur que les majuscules.
// Enter different values for string1 and string2 to
// experiement with behavior of CompareTo
string string1 = "ABC";
string string2 = "abc";
int result2 = string1.CompareTo(string2);
if (result2 > 0)
{
System.Console.WriteLine("{0} is greater than {1}", string1, string2);
}
else if (result2 == 0)
{
System.Console.WriteLine("{0} is equal to {1}", string1, string2);
}
else if (result2 < 0)
{
System.Console.WriteLine("{0} is less than {1}", string1, string2);
}
// Output: ABC is less than abc
Pour rechercher une chaîne à l'intérieur d'une autre chaîne, utilisez IndexOf(). IndexOf() retourne -1 si la chaîne recherchée est introuvable ; sinon, l'index de base zéro du premier emplacement dans lequel elle se trouve est retourné.
// Date strings are interpreted according to the current culture.
// If the culture is en-US, this is interpreted as "January 8, 2008",
// but if the user's computer is fr-FR, this is interpreted as "August 1, 2008"
string date = "01/08/2008";
DateTime dt = Convert.ToDateTime(date);
Console.WriteLine("Year: {0}, Month: {1}, Day: {2}", dt.Year, dt.Month, dt.Day);
// Specify exactly how to interpret the string.
IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);
// Alternate choice: If the string has been input by an end user, you might
// want to format it according to the current culture:
// IFormatProvider culture = System.Threading.Thread.CurrentThread.CurrentCulture;
DateTime dt2 = DateTime.Parse(date, culture, System.Globalization.DateTimeStyles.AssumeLocal);
Console.WriteLine("Year: {0}, Month: {1}, Day {2}", dt2.Year, dt2.Month, dt2.Day);
/* Output (assuming first culture is en-US and second is fr-FR):
Year: 2008, Month: 1, Day: 8
Year: 2008, Month: 8, Day 1
*/
Fractionnement d'une chaîne en sous-chaînes
Le fractionnement d'une chaîne en sous-chaînes, par exemple, le fractionnement d'une phrase en mots, est une tâche de programmation courante. La méthode Split() prend un tableau char de séparateurs, par exemple un caractère d'espacement, et retourne un tableau de sous-chaînes. Vous pouvez accéder à ce tableau à l'aide de foreach, comme ceci :
string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
Console.WriteLine("number1 now = {0}", number1);
else
Console.WriteLine("numString is not a valid long");
byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
Console.WriteLine("number2 now = {0}", number2);
else
Console.WriteLine("numString is not a valid byte");
decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
Console.WriteLine("number3 now = {0}", number3);
else
Console.WriteLine("number3 is not a valid decimal");
Ce code fait ressortir chaque mot sur une ligne distincte, comme ceci :
The
cat
sat
on
the
mat.
Utilisation de StringBuilder
La classe StringBuilder crée une mémoire tampon de chaîne qui offre de meilleures performances si votre programme exécute un grand nombre de traitements de chaînes. La classe StringBuilder vous permet également de réassigner différents caractères, chose que le type de données String intégré ne prend pas en charge.
Dans cet exemple, un objet StringBuilder est créé, et son contenu est ajouté individuellement à l'aide de la méthode Append.
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789
// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];
System.Console.WriteLine(sb); // displays 9123456789
}
}
Voir aussi
Tâches
Comment : générer des littéraux de chaîne multilignes (Visual C#)
Comment : rechercher une chaîne dans un tableau de chaînes
Comment : effectuer une recherche dans une chaîne
Concepts
Types de données intégrés (Visual C# Express)