Ciągi (Przewodnik programowania w języku C#)

Ciąg jest obiektem typu String których wartość jest tekstem.Wewnętrznie, tekst jest przechowywane jako sekwencyjne kolekcji tylko do odczytu z Char obiektów.Nie ma żadnych znaków kończące null na końcu C# ciąg; Dlatego C# ciąg może zawierać dowolną liczbę osadzonych znaków null (\0).Length Właściwość ciąg reprezentuje liczbę Char obiektów zawiera, nie liczba znaków Unicode.Aby uzyskać dostęp do poszczególnych punktów kodu Unicode w ciągu znaków, należy użyć StringInfo obiektu.

ciąg vs.System.String

W języku C# string słowo kluczowe jest aliasem dla String.W związku z tym String i string są równoważne, a można użyć niezależnie od konwencji nazewnictwa wolisz.String Klasy oferuje wiele metod bezpiecznego tworzenia, manipulowania i porównywanie ciągów.Ponadto w języku C# overloads niektóre podmioty gospodarcze do uproszczenia typowe operacje na ciągach.Aby uzyskać więcej informacji na temat słowa kluczowego, zobacz string (odwołanie w C#).Aby uzyskać więcej informacji na temat typu i jego metod, zobacz String.

Deklarowanie i Inicjowanie ciągi

Można zadeklarować i zainicjować ciągi na różne sposoby, jak pokazano w następującym przykładzie:

// Declare without initializing. 
string message1;

// Initialize to null. 
string message2 = null;

// Initialize as an empty string. 
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

//Initialize with a regular string literal. 
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal. 
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body) 
// you can use implicit typing. 
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from 
// being used to store another string value. 
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating 
// a string from a char*, char[], or sbyte*. See 
// System.String documentation for details. 
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

Należy zauważyć, że nie używasz Nowy operatora do utworzenia obiektu string, z wyjątkiem przypadków, gdy inicjowanie ciąg z tablicy znaków.

Zainicjuj ciąg składający się z Empty wartość stałą, aby utworzyć nową String obiektu, którego ciąg znaków o zerowej długości.Reprezentacja literału ciągu ciągu o zerowej długooci jest "".Poprzez inicjalizację ciągi z Empty wartość zamiast null, można zmniejszyć szanse na NullReferenceException występujących.Użyj statycznego IsNullOrEmpty(String) metodę sprawdzania wartość ciągu, przed przystąpieniem do niego dostęp.

Niezmienność obiektów typu String

Są obiektami String niezmienne: nie można zmienić po ich utworzeniu.Wszystkie String metody i C# operatorów, które pojawiają się, aby zmodyfikować ciąg faktycznie zwracają wyniki w nowym obiekcie string.W poniższym przykładzie gdy zawartość s1 i s2 są tak łączone, tworzą jeden ciąg znaków, dwa ciągi oryginalne są zmodyfikowane.+= Operator tworzy nowy ciąg znaków zawierający zawartość Scalonej.Ten nowy obiekt jest przypisana do zmiennej s1, a oryginalny obiekt, który został przypisany do s1 została zwolniona do wyrzucania elementów bezużytecznych, ponieważ nie inne zmienna przechowuje odniesienie do niej.

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.

Ponieważ ciąg "zmiana" jest rzeczywiście nowych tworzenie ciąg znaków, należy użyć ostrożność podczas tworzenia odwołania do ciągów.Jeśli utworzenie odwołania do ciągu, a następnie "zmodyfikuj" oryginalny ciąg znaków odniesienia nadal wskaż oryginalny obiekt zamiast nowego obiektu, który został utworzony podczas został zmodyfikowany ciąg.Poniższy kod ilustruje to zachowanie:

string s1 = "Hello ";
string s2 = s1;
s1 += "World";

System.Console.WriteLine(s2);
//Output: Hello

Aby uzyskać więcej informacji na temat sposobów tworzenia nowych ciągów, które są oparte na modyfikacje, takie jak wyszukiwanie i zamienianie operacji na oryginalny ciąg znaków, zobacz Porady: modyfikowanie zawartości ciągu (Przewodnik programowania w języku C#).

Regularne i pełne literały ciągów znaków

W programie literały ciągów znaków regularne należy osadzić znaków escape, świadczone przez C#, jak pokazano w następującym przykładzie:

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

Przy verbatim ciągi dla wygody i poprawienia czytelności tekst ciąg zawiera znaki odwróconej kreski ułamkowej, na przykład w przypadku ścieżki pliku.Ponieważ ciągi verbatim zachować znaki nowego wiersza jako część tekstu ciąg, mogą być używane zainicjować ciągi wielowierszowe.Aby osadzić znak cudzysłowu wewnątrz ciąg verbatim należy użyć znaku cudzysłowu.Niektóre typowe zastosowania verbatim ciągi znaków można znaleźć w poniższym przykładzie:

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."

Ciąg sekwencje unikowe

Sekwencja unikowa

Nazwa znaku

Kodowanie Unicode

\'

Pojedynczy cudzysłów

0x0027

\"

Podwójny cudzysłów

0x0022

\\

Kreska ułamkowa odwrócona

0x005C

\0

Wartość NULL

0x0000

\a

Alert

0x0007

\b

BACKSPACE

0X0008

\f

Wysuw strony

0x000C

\n

Nowy wiersz

0x000A

\r

Powrót karetki

0x000D

\t

Tabulator poziomy

0x0009

\U

Sekwencja escape Unicode dla pary części znaku dwuskładnikowego.

\Unnnnnnnn

\u

Sekwencja Unicode

\u0041 = "A"

\v

Tabulacji pionowej

0x000B

\x

Sekwencje Unicode podobne do "\u" z wyjątkiem o zmiennej długości.

\x0041 = "A"

[!UWAGA]

W czasie kompilacji verbatim ciągi są konwertowane na zwykłym ciągi zawierające same sekwencje escape.W związku z tym jeśli ciąg verbatim można wyświetlić w oknie watch debugera, zostanie wyświetlony znaków escape, które zostały dodane przez kompilator nie verbatim wersji z kodu źródłowego.Na przykład ciąg verbatim @ "C:\files.txt" pojawi się w oknie czujki jako "C:\\files.txt".

Ciągi formatów

Ciąg formatu jest ciągiem, którego zawartość można określane dynamicznie w czasie wykonywania.Utworzyć ciąg formatu przy użyciu statycznego Format metody i osadzanie symbole zastępcze w nawiasach klamrowych, które zostaną zastąpione przez inne wartości w czasie wykonywania.W poniższym przykładzie użyto ciągu formatu do wyprowadzenia wynik każdej iteracji pętli:

class FormatString
{
    static void Main()
    {
        // Get user input.
        System.Console.WriteLine("Enter a number");
        string input = System.Console.ReadLine();

        // Convert the input string to an int. 
        int j;
        System.Int32.TryParse(input, out j);

        // Write a different string each iteration. 
        string s;
        for (int i = 0; i < 10; i++)
        {
            // A simple format string with no alignment formatting.
            s = System.String.Format("{0} times {1} = {2}", i, j, (i * j));
            System.Console.WriteLine(s);
        }

        //Keep the console window open in debug mode.
        System.Console.ReadKey();
    }
}

Przeciążenie jeden z WriteLine metoda pobiera ciąg formatu jako parametr.W związku z tym można osadzić tylko ciąg formatu literałowych bez jawnym wywołaniem metody.Jednakże jeśli używasz WriteLine metody, aby wyświetlić dane wyjściowe debugowania w środowisku Visual Studio danych wyjściowych okna, należy jawnie wywołać Format metoda ponieważ WriteLine akceptuje tylko ciąg znaków, nie ciąg formatu.Aby uzyskać więcej informacji na temat ciągi formatów, zobacz Typy formatowania w programie .NET Framework.

Podciągów

Podciąg jest sekwencja znaków, który znajduje się w ciągu.Użyj Substring metodę, aby utworzyć nowy ciąg z częścią oryginalnego ciągu.Jedno lub więcej wystąpień podciągu można wyszukiwać za pomocą IndexOf metody.Użyj Replace metodę, aby zastąpić wszystkie wystąpienia określony podciąg nowy ciąg znaków.Podobnie jak Substring metody, Replace faktycznie zwraca nowy ciąg znaków i nie modyfikuje oryginalnego ciągu.Aby uzyskać więcej informacji, zobacz Porady: wyszukiwanie ciągów za pomocą metod ciągów (Przewodnik programowania w języku C#) i Porady: modyfikowanie zawartości ciągu (Przewodnik programowania w języku C#).

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

Uzyskiwanie dostępu do pojedynczych znaków

Za pomocą notacji tablicy i wartość indeksu uzyskanie dostępu tylko do odczytu do pojedynczych znaków, jak w poniższym przykładzie:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

Jeśli String metody nie zapewniają funkcjonalność, która musi mieć do modyfikowania pojedynczych znaków w ciągu, można użyć StringBuilder obiekt, aby zmodyfikować indywidualne znaki "w miejsce", a następnie utwórz nowy ciąg znaków do przechowywania wyników za pomocą StringBuilder metody.W poniższym przykładzie przyjmijmy, że musi zmodyfikować oryginalny ciąg znaków w szczególny sposób, a następnie zapisać wyniki do wykorzystania w przyszłości:

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?            

Ciągi NULL i puste ciągi

Pusty ciąg znaków jest instancją String obiekt, który zawiera zero znaków.Puste ciągi są często używane w różnych scenariuszach programowania do reprezentowania puste pole.Ponieważ są one prawidłowe, można wywołać metody na puste ciągi String obiektów.Puste ciągi są inicjowane w następujący sposób:

string s = String.Empty;

Z drugiej strony, ciąg null nie odnosi się do wystąpienia String obiektu i każda próba wywołania metody na ciąg null powoduje, że NullReferenceException.Jednak można użyć null ciągi w złączenie i operacjach porównania z innymi ciągami.Poniższe przykłady ilustrują w niektórych przypadkach, w których odwołanie do ciągu null i nie powodować być zgłoszony wyjątek:

static void Main()
{
    string str = "hello";
    string nullStr = null;
    string emptyStr = String.Empty;

    string tempStr = str + nullStr;
    // Output of the following line: hello
    Console.WriteLine(tempStr);

    bool b = (emptyStr == nullStr);
    // Output of the following line: False
    Console.WriteLine(b);

    // The following line creates a new empty string. 
    string newStr = emptyStr + nullStr;

    // Null strings and empty strings behave differently. The following 
    // two lines display 0.
    Console.WriteLine(emptyStr.Length);
    Console.WriteLine(newStr.Length);
    // The following line raises a NullReferenceException. 
    //Console.WriteLine(nullStr.Length); 

    // The null character can be displayed and counted, like other chars. 
    string s1 = "\x0" + "abc";
    string s2 = "abc" + "\x0";
    // Output of the following line: * abc*
    Console.WriteLine("*" + s1 + "*");
    // Output of the following line: *abc *
    Console.WriteLine("*" + s2 + "*");
    // Output of the following line: 4
    Console.WriteLine(s2.Length);
}

Szybkie tworzenie ciąg przy użyciu StringBuilder

Ciąg działań.NET są bardzo dobrze optymalizowana i w większości przypadków nie znacząco obniżyć wydajność.Jednakże w niektórych scenariuszach, takich jak pętle ścisła, które są wykonywane setki lub tysiące razy, operacje na ciągach może wpłynąć na wydajność.StringBuilder Klasy tworzy buforu ciągów, która zapewnia lepszą wydajność, jeśli program wykonuje wiele manipulacje ciąg.StringBuilder Ciąg umożliwia również przypisać pojedynczych znaków coś wbudowanych ciąg nie obsługuje typu danych.Ten kod, na przykład zmiany zawartości ciąg bez tworzenia nowy ciąg znaków:

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

//Outputs Cat: the ideal pet

W tym przykładzie StringBuilder obiekt jest używany do utworzenia ciągu znaków z zestaw typów liczbowych:

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
    }
}

Ciągi, metody rozszerzenie i LINQ

Ponieważ String wpisz implementuje IEnumerable, można użyć metody rozszerzenie określone w Enumerable klasy na ciągi znaków.Aby uniknąć bałaganu wizualne, metody te są wyłączone z technologii IntelliSense dla String typu, ale są jednak dostępne.Można również użyć LINQ kwerendy wyrażenia na ciągi znaków.Aby uzyskać więcej informacji, zobacz LINQ i ciągi.

Tematy pokrewne

Temat

Opis

Porady: modyfikowanie zawartości ciągu (Przewodnik programowania w języku C#)

Zawiera przykładowy kod, który ilustruje, jak zmodyfikować zawartość ciągi.

Porady: łączenie wielu ciągów (Przewodnik programowania w języku C#)

Ilustruje sposób użycia + operatora i Stringbuilder klasy do przyłączenia ciągi razem w czasie kompilacji i w czasie wykonywania.

Porady: porównywanie ciągów (Przewodnik programowania w języku C#)

Pokazuje, jak wykonywać porządkowej porównania ciągów.

Porady: dzielenie ciągów (Przewodnik programowania w języku C#)

Zawiera przykładowy kod, który ilustruje, jak używać String.Split metody do analizowania ciągów.

Porady: wyszukiwanie ciągów za pomocą metod ciągów (Przewodnik programowania w języku C#)

Wyjaśnia sposób użycia specjalnych metod do wyszukiwania ciągów.

Porady: wyszukiwanie ciągów za pomocą wyrażeń regularnych (Przewodnik programowania w języku C#)

Wyjaśniono, jak używać wyrażeń regularnych do wyszukiwania ciągów.

Porady: określanie, czy ciąg reprezentuje wartość numeryczną (Przewodnik programowania w języku C#)

Pokazuje, jak bezpiecznie analizować ciąg, aby zobaczyć, czy ma prawidłową wartość numeryczną.

Porady: konwertowanie ciągu na DateTime (Przewodnik programowania w języku C#)

Pokazuje, jak konwertować ciąg, takie jak "01/24/2008" do DateTime obiektu.

Podstawowe operacje na ciągach w programie .NET Framework

Zawiera łącza do tematów, które używają String i StringBuilder metod, aby wykonywać operacje na ciągach podstawowe.

Analizowanie ciągów w programie .NET Framework

W tym artykule opisano sposób wstawiania znaków lub puste przestrzenie na ciąg znaków.

Porównywanie ciągów w programie .NET Framework

Zawiera informacje dotyczące sposobu do porównywania ciągów znaków i przykłady w C# i Visual Basic.

Używanie klasy StringBuilder w programie .NET Framework

W tym artykule opisano sposób tworzenia i modyfikowania obiektów dynamiczny ciąg znaków za pomocą StringBuilder klasy.

LINQ i ciągi

Zawiera informacje o sposobach wykonywać różne operacje na ciągach za pomocą zapytań LINQ.

Przewodnik programowania w języku C#

Zawiera łącza do tematów, które wyjaśniają konstrukcji programowania w języku C#.

Promowane rozdziału książki.

Więcej informacji na temat zmiennych w początku Visual C# 2010