Поделиться через


Практическое руководство. Сцепка нескольких строк (Руководство по программированию на C#)

Объединение — это процесс добавления одной строки к концу другой. При объединении строковых литералов или строковых констант с помощью оператора + компилятор создает одну строку. Объединение среды выполнения не происходит. Однако строковые переменные могут быть объединены только во время выполнения. В таком случае следует уяснить влияние различных подходов на производительность.

Пример

В следующем примере показано разделение длинного строкового литерала на маленькие строки для повышения удобочитаемости в исходном коде. Во время компиляции эти части будут объединены в одну строку. Производительность не снижается, независимо от количества используемых строк.

static void Main()
{
    // Concatenation of literals is performed at compile time, not run time. 
    string text = "Historically, the world of data and the world of objects " +
    "have not been well integrated. Programmers work in C# or Visual Basic " +
    "and also in SQL or XQuery. On the one side are concepts such as classes, " +
    "objects, fields, inheritance, and .NET Framework APIs. On the other side " +
    "are tables, columns, rows, nodes, and separate languages for dealing with " +
    "them. Data types often require translation between the two worlds; there are " +
    "different standard functions. Because the object world has no notion of query, a " +
    "query can only be represented as a string without compile-time type checking or " +
    "IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
    "objects in memory is often tedious and error-prone.";

    Console.WriteLine(text);
}

Для объединения строковых переменных можно использовать операторы + или += или методы String.Concat, String.Format или StringBuilder.Append. Оператор + прост в использовании и позволяет сформировать наглядный код. Даже при одновременном использовании нескольких операторов "+" содержимое строки копируется только один раз. Однако если повторить такую операцию несколько раз (например, в цикле), могут возникнуть проблемы с производительностью. Например, рассмотрим следующий код:

static void Main(string[] args)
{
    // To run this program, provide a command line string. 
    // In Visual Studio, see Project > Properties > Debug. 
    string userName = args[0];
    string date = DateTime.Today.ToShortDateString();

    // Use the + and += operators for one-time concatenations. 
    string str = "Hello " + userName + ". Today is " + date + ".";
    System.Console.WriteLine(str);

    str += " How are you today?";
    System.Console.WriteLine(str);

    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
}

// Example output:  
//  Hello Alexander. Today is 1/22/2008. 
//  Hello Alexander. Today is 1/22/2008. How are you today? 
//  Press any key to exit. 
//

Примечание

В операциях объединения строк компилятор С# обрабатывает нулевую строку так же, как пустую строку, но не преобразовывает значение исходной нулевой строки.

Если не выполняется объединения большого количества строк (например, в цикле), то снижение производительности этого кода, вероятно, будет незначительным. Это также относится к методам String.Concat и String.Format.

Однако, если самым важным является производительность, то для объединения строк всегда следует использовать класс StringBuilder. В следующем коде используется метод Append класса StringBuilder для объединения строк без "эффекта цепочки" оператора +.

class StringBuilderTest
{
    static void Main()
    {
        string text = null;

        // Use StringBuilder for concatenation in tight loops.
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        for (int i = 0; i < 100; i++)
        {
            sb.AppendLine(i.ToString());
        }
        System.Console.WriteLine(sb.ToString());

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
// Output: 
// 0 
// 1 
// 2 
// 3 
// 4 
// ... 
//

См. также

Ссылки

String

StringBuilder

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Строки (Руководство по программированию на C#)