String Конструкторы

Определение

Инициализирует новый экземпляр класса String.

Перегрузки

String(Char*)

Инициализирует новый экземпляр класса String значением, определенным указателем на массив знаков Юникода.

String(Char[])

Инициализирует новый экземпляр класса String символами Юникода, заданными в виде массива символов.

String(ReadOnlySpan<Char>)

Инициализирует новый экземпляр класса String символами Юникода, заданными в виде доступного только для чтения диапазона.

String(SByte*)

Инициализирует новый экземпляр класса String значением, определенным указателем на массив 8-разрядных целых чисел со знаком.

String(Char, Int32)

Инициализирует новый экземпляр класса String значением, полученным путем повторения заданного знака Юникода указанное число раз.

String(Char*, Int32, Int32)

Инициализирует новый экземпляр класса String значением, которое определяется заданным указателем на массив знаков Юникода, начальной позицией знака в этом массиве и длиной.

String(Char[], Int32, Int32)

Инициализирует новый экземпляр класса String значением, заданным массивом знаков Юникода, начальной позицией знака в пределах данного массива и длиной.

String(SByte*, Int32, Int32)

Инициализирует новый экземпляр класса String значением, определяемым заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией в пределах массива и длиной.

String(SByte*, Int32, Int32, Encoding)

Инициализирует новый экземпляр класса String значением, определенным заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией в пределах этого массива, длиной и объектом Encoding.

Комментарии

Содержание

Синтаксис перегруженного конструктора
Вход
Отличи
Какой метод следует вызывать?
Создание строк
Обрабатывает повторяющиеся строки

Примеры создания экземпляров строк:

Использовать присваивание строк
Использовать массив символов
Использование части массива символов и повторение одного символа
Использование указателя на массив символов
Использование указателя и диапазона массива
Использование указателя на массив байтов со знаком

Синтаксис перегруженного конструктора

Конструкторы строк делятся на две категории: без параметров указателя и с параметрами указателя. Конструкторы, использующие указатели, не являются CLS-совместимыми. кроме того, Visual Basic не поддерживает использование указателей, а C# требует, чтобы код, использующий указатели, выполнялся в ненадежном контексте. Дополнительные сведения см. в разделе unsafe.

Дополнительные рекомендации по выбору перегрузки см. в разделе какой метод следует вызывать?.

String(Char[] value)
Инициализирует новый экземпляр значением, указанным в массиве символов Юникода. Этот конструктор копирует символы Юникода (Пример).

String(Char[] value, Int32 startIndex, Int32 length)
Инициализирует новый экземпляр значением, указанным в массиве символов Юникода, начальной позицией символа в этом массиве и длиной (Пример).

String(Char c, Int32 count)
Инициализирует новый экземпляр со значением, указанным в указанном символе Юникода, повторяемым указанное число раз (например,).

String(char* value)
(Не совместимо с CLS) Инициализирует новый экземпляр значением, указанным указателем на массив символов Юникода, заканчивающийся нулевым символом (U + 0000 или ' \ 0 '). (Пример).

Разрешение: SecurityCriticalAttribute для немедленного вызывающего объекта требуется полное доверие. Этот член не может использоваться частично доверенным или прозрачным кодом.

String(char* value, Int32 startIndex, Int32 length)
(Не совместимо с CLS) Инициализирует новый экземпляр значением, указанным указателем на массив символов Юникода, начальной позицией символа в этом массиве и длиной. Конструктор копирует символы Юникода, начиная с value индекса startIndex и заканчивая индексом startIndex + length 1 (например,).

Разрешение: SecurityCriticalAttribute для немедленного вызывающего объекта требуется полное доверие. Этот член не может использоваться частично доверенным или прозрачным кодом.

String(SByte* value)
(Не совместимо с CLS) Инициализирует новый экземпляр значением, указанным указателем на массив 8-разрядных целых чисел со знаком. Предполагается, что массив представляет собой строку, закодированную с помощью текущей системной кодовой страницы (то есть кодировка, заданная параметром Encoding.Default ). Конструктор обрабатывает символы, value начиная с расположения, заданного указателем, до тех пор, пока не будет достигнут символ null (например,).

Разрешение: SecurityCriticalAttribute для немедленного вызывающего объекта требуется полное доверие. Этот член не может использоваться частично доверенным или прозрачным кодом.

String(SByte* value, Int32 startIndex, Int32 length)
(Не совместимо с CLS) Инициализирует новый экземпляр значением, указанным указателем на массив 8-разрядных целых чисел со знаком, начальную точку в этом массиве и длину. Предполагается, что массив представляет собой строку, закодированную с помощью текущей системной кодовой страницы (то есть кодировка, заданная параметром Encoding.Default ). Конструктор обрабатывает символы из значения, начинающегося с startIndex и заканчивая значением startIndex + length -1 (например,).

Разрешение: SecurityCriticalAttribute для немедленного вызывающего объекта требуется полное доверие. Этот член не может использоваться частично доверенным или прозрачным кодом.

String(SByte* value, Int32 startIndex, Int32 length, Encoding enc)
(Не совместимо с CLS) Инициализирует новый экземпляр значением, указанным указателем на массив 8-разрядных целых чисел со знаком, начальную точку в пределах этого массива, длину и Encoding объект.

Разрешение: SecurityCriticalAttribute для немедленного вызывающего объекта требуется полное доверие. Этот член не может использоваться частично доверенным или прозрачным кодом.

Параметры

Ниже приведен полный список параметров, используемых String конструкторами, не включающими параметр указателя. Параметры, используемые каждой перегрузкой, см. в описании приведенного выше синтаксиса перегрузки.

Параметр Тип Описание
value Char[] Массив знаков Юникода.
c Char Знак Юникода.
startIndex Int32 Начальная позиции в value первом символе в новой строке.

Значение по умолчанию: 0
length Int32 Число символов в value , включаемых в новую строку.

Значение по умолчанию — Array.Length.
count Int32 Количество c повторений символа в новой строке. Если count равен нулю, значение нового объекта равно String.Empty .

Ниже приведен полный список параметров, используемых String конструкторами, включающими параметр указателя. Параметры, используемые каждой перегрузкой, см. в описании приведенного выше синтаксиса перегрузки.

Параметр Тип Описание
value Char*

-или-

SByte*
Указатель на массив символов Юникода, заканчивающийся нулем, или массив 8-разрядных целых чисел со знаком. Если value параметр имеет null значение или является пустым массивом, значением новой строки будет String.Empty .
startIndex Int32 Индекс элемента массива, который определяет первый символ в новой строке.

Значение по умолчанию: 0
length Int32 Число элементов массива, используемых для создания новой строки. Если значение length равно нулю, конструктор создает строку со значением String.Empty .

Значение по умолчанию — Array.Length.
enc Encoding Объект, указывающий способ value кодирования массива.

Значение по умолчанию: Encoding.Default или Текущая кодовая страница ANSI системы

Исключения

Ниже приведен список исключений, создаваемых конструкторами, которые не включают параметры указателя.

Исключение Условие Кем создано
ArgumentNullException value имеет значение null. String(Char[], Int32, Int32)
ArgumentOutOfRangeException startIndexзначение, length или count меньше нуля.

-или-

Сумма startIndex и length больше, чем число элементов в value.

-или-

Значение параметра count меньше нуля.
String(Char, Int32)

String(Char[], Int32, Int32)

Ниже приведен список исключений, создаваемых конструкторами, которые включают в себя параметры-указатели.

Исключение Условие Кем создано
ArgumentException value Указывает массив, содержащий недопустимый символ Юникода.

-или-

valueили value + startIndex указывает адрес, размер которого меньше 64 КБ.

-или-

Не String удалось инициализировать новый экземпляр из value массива байтов, так как не value использует кодировку кодовой страницы по умолчанию.
Все конструкторы с указателями.
ArgumentNullException Параметр value имеет значение null. String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)
ArgumentOutOfRangeException Текущий процесс не имеет доступа на чтение ко всем рассматриваемым символам.

-или-

startIndex или length меньше нуля, value + startIndex приводит к переполнению указателя, или текущий процесс не имеет доступа на чтение ко всем адресуемым символам.

-или-

Длина новой строки слишком велика для выделения.
Все конструкторы с указателями.
AccessViolationException value, или value + startIndex + length -1, указывает недопустимый адрес. String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)

Какой метод следует вызывать?

Кому Вызов или использование
Создайте строку. Присваивание из строкового литерала или существующей строки (Пример)
Создать строку из целого массива символов. String(Char[]) (Пример)
Создать строку из части массива символов. String(Char[], Int32, Int32) (Пример)
Создайте строку, которая повторяет один и тот же символ несколько раз. String(Char, Int32) (Пример)
Создать строку из указателя на массив символов в Юникоде или расширенную кодировку. String(Char*)
Создание строки из части массива символов Юникода или расширенного символа с помощью указателя. String(Char*, Int32, Int32)
Создать строку из char массива C++. String(SByte*), String(SByte*, Int32, Int32)

-или-

String(SByte*, Int32, Int32, Encoding)
Создайте строку из символов ASCII. ASCIIEncoding.GetString

Создание строк

Наиболее часто используемый способ создания строк программным способом — это простое присваивание, как показано в этом примере. StringКласс также включает четыре типа перегрузок конструктора, которые позволяют создавать строки из следующих значений:

  • Из массива символов (массива символов в кодировке UTF-16). Новый объект можно создать String на основе символов во всем массиве или в его части. String(Char[])Конструктор копирует все символы в массиве в новую строку. String(Char[], Int32, Int32)Конструктор копирует символы из индекса startIndex в индекс startIndex + length -1 в новую строку. Если length равно нулю, значение новой строки равно String.Empty .

    Если код многократно создает строки с одинаковым значением, можно повысить производительность приложения с помощью альтернативного способа создания строк. Дополнительные сведения см. в разделе Обработка повторяющихся строк.

  • Из одного символа, дублирующего ноль, один или более раз с помощью String(Char, Int32) конструктора. Если count равно нулю, значение новой строки равно String.Empty .

  • Из указателя на массив символов, заканчивающийся нулем, с помощью String(Char*) String(Char*, Int32, Int32) конструктора или. Для инициализации строки можно использовать либо весь массив, либо указанный диапазон. Конструктор копирует последовательность символов Юникода, начиная с указанного указателя или с указанного указателя и заканчивая startIndex до конца массива или для length символов. Если value является пустым указателем или length равен нулю, конструктор создает строку, значение которой равно String.Empty . Если операция копирования продолжается до конца массива, а массив не завершается нулем, поведение конструктора зависит от системы. Такое условие может вызвать нарушение прав доступа.

    Если массив содержит любые внедренные символы NULL (U + 0000 или ' \ 0 ') и String(Char*, Int32, Int32) вызывается перегрузка, то экземпляр строки содержит length символы, включая любые внедренные значения NULL. В следующем примере показано, что происходит, когда в метод передается указатель на массив из 10 элементов, включающий в себя два символа NULL String(Char*, Int32, Int32) . Поскольку адрес — это начало массива, и все элементы массива должны быть добавлены в строку, конструктор создает экземпляр строки с десятью символами, включая два встроенных значения NULL. С другой стороны, если в конструктор передается один и тот же массив String(Char*) , результатом является строка из четырех символов, которая не включает первый символ null.

    using namespace System;
    
    void main()
    {
       wchar_t chars[] = { L'a', L'b', L'c', L'd', L'\0', L'A', L'B', 
                           L'C', L'D', L'\0' };
       Char* chPtr = chars;
       String^ s = gcnew String(chPtr, 0, 
                                sizeof(chars) / sizeof (wchar_t));            
       for each (Char ch in s)
          Console::Write("{0:X4} ", Convert::ToUInt16(ch));
       Console::WriteLine();
       
       s = gcnew String(chPtr);         
       
       for each (Char ch in s)
          Console::Write("{0:X4} ", Convert::ToUInt16(ch));
       Console::WriteLine();    
    }
    // The example displays the following output:
    //       0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //       0061 0062 0063 0064
    
    using System;
    
    public class Example
    {
       public unsafe static void Main()
       {
          char[] chars = { 'a', 'b', 'c', 'd', '\0', 'A', 'B', 'C', 'D', '\0' };
          string s = null;
          
          fixed(char* chPtr = chars) {
             s = new string(chPtr, 0, chars.Length);            
          } 
    
          foreach (var ch in s)
             Console.Write($"{(ushort)ch:X4} ");
          Console.WriteLine();
          
          fixed(char* chPtr = chars) {
             s = new string(chPtr);         
          }
          
          foreach (var ch in s)
             Console.Write($"{(ushort)ch:X4} ");
          Console.WriteLine();    
       }
    }
    // The example displays the following output:
    //       0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //       0061 0062 0063 0064
    

    Массив должен содержать символы Юникода. В C++ это означает, что массив символов должен быть определен как управляемый Char тип [] или как неуправляемый wchar_t тип [].

    Если String(Char*) перегрузка вызвана и массив не завершается нулем или если String(Char*, Int32, Int32) вызвана перегрузка, а startIndex + length -1 включает диапазон, который находится за пределами памяти, выделенной для последовательности символов, поведение конструктора зависит от системы, и может возникнуть нарушение прав доступа.

  • Из указателя на массив байтов со знаком. Для инициализации строки можно использовать либо весь массив, либо указанный диапазон. Последовательность байтов может интерпретироваться с помощью кодировки кодовой страницы по умолчанию, или в вызове конструктора можно указать кодировку. Если конструктор пытается создать экземпляр строки из целого массива, который не завершается нулем, или диапазон массива от value + startIndex до value + startIndex + length -1 находится за пределами памяти, выделенной для массива, поведение этого конструктора зависит от системы, и может возникнуть нарушение прав доступа.

    Три конструктора, включающие массив байтов со знаком в качестве параметра, предназначены в первую очередь для преобразования char массива C++ в строку, как показано в следующем примере:

    using namespace System;
    
    void main()
    {
          char chars[] = { 'a', 'b', 'c', 'd', '\x00' };
          
          char* charPtr = chars;
          String^ value = gcnew String(charPtr);
    
          Console::WriteLine(value);
    }
    // The example displays the following output:
    //      abcd
    

    Если массив содержит любые символы NULL ("\ 0") или байты, значение которых равно 0 и String(SByte*, Int32, Int32) вызывается перегрузка, то экземпляр строки содержит length символы, включая любые внедренные значения NULL. В следующем примере показано, что происходит, когда в метод передается указатель на массив из 10 элементов, включающий в себя два символа NULL String(SByte*, Int32, Int32) . Поскольку адрес — это начало массива, и все элементы массива должны быть добавлены в строку, конструктор создает экземпляр строки с десятью символами, включая два встроенных значения NULL. С другой стороны, если в конструктор передается один и тот же массив String(SByte*) , результатом является строка из четырех символов, которая не включает первый символ null.

    using namespace System;
    
    void main()
    {
       char bytes[] = { 0x61, 0x62, 0x063, 0x064, 0x00, 0x41, 0x42,0x43, 
                        0x44, 0x00 };
       
       char* bytePtr = bytes;
       String^ s = gcnew String(bytePtr, 0, sizeof(bytes) / sizeof (char));
       
       for each (Char ch in s)
          Console::Write("{0:X4} ", Convert::ToUInt16(ch));
       
       Console::WriteLine();
       
       s = gcnew String(bytePtr);
    
       for each (Char ch in s)
          Console::Write("{0:X4} ", Convert::ToUInt16(ch));
       Console::WriteLine();       
    }
    // The example displays the following output:
    //      0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //      0061 0062 0063 0064
    
    using System;
    
    public class Example
    {
       public unsafe static void Main()
       {
          sbyte[] bytes = { 0x61, 0x62, 0x063, 0x064, 0x00, 0x41, 0x42, 0x43, 0x44, 0x00 };
          
          string s = null;
          fixed (sbyte* bytePtr = bytes) {
             s = new string(bytePtr, 0, bytes.Length);
          }
          
          foreach (var ch in s)
             Console.Write($"{(ushort)ch:X4} ");
          
          Console.WriteLine();    
    
          fixed(sbyte* bytePtr = bytes) {
             s = new string(bytePtr);         
          }
          
          foreach (var ch in s)
             Console.Write($"{(ushort)ch:X4} ");
          Console.WriteLine();    
       }
    }
    // The example displays the following output:
    //       0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //       0061 0062 0063 0064
    

    Поскольку String(SByte*) String(SByte*, Int32, Int32) конструкторы и обрабатываются с value помощью кодовой страницы ANSI по умолчанию, вызов этих конструкторов с одинаковыми массивами байтов может создать строки, имеющие разные значения в разных системах.

Обрабатывает повторяющиеся строки

Приложения, которые анализируют или декодируются потоки текста, часто используют String(Char[], Int32, Int32) конструктор или StringBuilder.Append(Char[], Int32, Int32) метод для преобразования последовательностей символов в строку. Повторное создание новых строк с одинаковым значением вместо создания и повторного использования одной строки приводит к нерасходованию памяти. Если вы, вероятно, создадите одинаковое строковое значение повторно, вызвав String(Char[], Int32, Int32) конструктор, даже если вы не понимаете, что такое идентичные строковые значения, можно использовать таблицу уточняющих запросов.

Например, предположим, что вы читаете и анализируете поток символов из файла, содержащего XML-теги и атрибуты. При синтаксическом анализе потока происходит многократное возникновение определенных токенов (т. е. последовательностей символов, имеющих символьное значение). Маркеры, эквивалентные строкам "0", "1", "true" и "false", скорее всего, часто встречаются в потоке XML.

Вместо преобразования каждого токена в новую строку можно создать System.Xml.NameTable объект для хранения часто встречающихся строк. NameTableОбъект повышает производительность, поскольку он извлекает сохраненные строки без выделения временной памяти. При возникновении маркера используйте NameTable.Get(Char[], Int32, Int32) метод для получения токена из таблицы. Если маркер существует, метод возвращает соответствующую строку. Если маркер не существует, используйте NameTable.Add(Char[], Int32, Int32) метод, чтобы вставить маркер в таблицу и получить соответствующую строку.

Пример 1. использование присваивания строк

В следующем примере создается новая строка путем присвоения ей строкового литерала. Он создает вторую строку, присваивая ей значение первой строки. Это два наиболее распространенных способа создания нового String объекта.

using namespace System;

void main()
{
   String^ value1 = L"This is a string.";
   String^ value2 = value1;
   Console::WriteLine(value1);
   Console::WriteLine(value2);
}
// The example displays the following output:
//    This is a string.
//    This is a string.
using System;

public class Example
{
   public static void Main()
   {
      String value1 = "This is a string.";
      String value2 = value1;
      Console.WriteLine(value1);
      Console.WriteLine(value2);
   }
}
// The example displays the following output:
//    This is a string.
//    This is a string.
Module Example
   Public Sub Main()
      Dim value1 As String = "This is a string."
      Dim value2 As String = value1
      Console.WriteLine(value1)
      Console.WriteLine(value2)
   End Sub
End Module
' The example displays the following output:
'    This is a string.
'    This is a string.

Пример 2. Использование массива символов

В следующем примере показано, как создать новый String объект из массива символов.

// Unicode Mathematical operators
wchar_t charArray1[4] = {L'\x2200',L'\x2202',L'\x200F',L'\x2205'};
wchar_t * lptstr1 =  &charArray1[ 0 ];
String^ wszMathSymbols = gcnew String( lptstr1 );

// Unicode Letterlike Symbols
wchar_t charArray2[4] = {L'\x2111',L'\x2118',L'\x2122',L'\x2126'};
wchar_t * lptstr2 =  &charArray2[ 0 ];
String^ wszLetterLike = gcnew String( lptstr2 );

// Compare Strings - the result is false
Console::WriteLine( String::Concat( L"The Strings are equal? ", (0 == String::Compare( wszLetterLike, wszMathSymbols ) ? (String^)"TRUE" : "FALSE") ) );
// Unicode Mathematical operators
char [] charArr1 = {'\u2200','\u2202','\u200F','\u2205'};
String szMathSymbols = new String(charArr1);

// Unicode Letterlike Symbols
char [] charArr2 = {'\u2111','\u2118','\u2122','\u2126'};
String szLetterLike = new String (charArr2);

// Compare Strings - the result is false
Console.WriteLine("The Strings are equal? " +
    (String.Compare(szMathSymbols, szLetterLike)==0?"true":"false") );
' Unicode Mathematical operators
Dim charArr1() As Char = {ChrW(&H2200), ChrW(&H2202), _
                          ChrW(&H200F), ChrW(&H2205)}
Dim szMathSymbols As New String(charArr1)

' Unicode Letterlike Symbols
Dim charArr2() As Char = {ChrW(&H2111), ChrW(&H2118), _
                          ChrW(&H2122), ChrW(&H2126)}
Dim szLetterLike As New String(charArr2)

' Compare Strings - the result is false
Console.WriteLine("The strings are equal? " & _
        CStr(szMathSymbols.Equals(szLetterLike)))

Пример 3. использование части массива символов и повторение одного символа

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

// Create a Unicode String with 5 Greek Alpha characters
String^ szGreekAlpha = gcnew String( L'\x0391',5 );

// Create a Unicode String with a Greek Omega character
wchar_t charArray5[3] = {L'\x03A9',L'\x03A9',L'\x03A9'};
String^ szGreekOmega = gcnew String( charArray5,2,1 );
String^ szGreekLetters = String::Concat( szGreekOmega, szGreekAlpha, szGreekOmega->Clone() );

// Examine the result
Console::WriteLine( szGreekLetters );

// The first index of Alpha
int ialpha = szGreekLetters->IndexOf( L'\x0391' );

// The last index of Omega
int iomega = szGreekLetters->LastIndexOf( L'\x03A9' );
Console::WriteLine( String::Concat(  "The Greek letter Alpha first appears at index ", Convert::ToString( ialpha ) ) );
Console::WriteLine( String::Concat(  " and Omega last appears at index ", Convert::ToString( iomega ),  " in this String." ) );
// Create a Unicode String with 5 Greek Alpha characters
String szGreekAlpha = new String('\u0391',5);
// Create a Unicode String with a Greek Omega character
String szGreekOmega = new String(new char [] {'\u03A9','\u03A9','\u03A9'},2,1);

String szGreekLetters = String.Concat(szGreekOmega, szGreekAlpha, szGreekOmega.Clone());

// Examine the result
Console.WriteLine(szGreekLetters);

// The first index of Alpha
int ialpha = szGreekLetters.IndexOf('\u0391');
// The last index of Omega
int iomega = szGreekLetters.LastIndexOf('\u03A9');

Console.WriteLine("The Greek letter Alpha first appears at index " + ialpha +
    " and Omega last appears at index " + iomega + " in this String.");
' Create a Unicode String with 5 Greek Alpha characters
Dim szGreekAlpha As New String(ChrW(&H0391), 5)
' Create a Unicode String with a Greek Omega character
Dim szGreekOmega As New String(New Char() {ChrW(&H03A9), ChrW(&H03A9), _
                                           ChrW(&H03A9)}, 2, 1)

Dim szGreekLetters As String = String.Concat(szGreekOmega, szGreekAlpha, _
                                             szGreekOmega.Clone())

' Examine the result
Console.WriteLine(szGreekLetters)

' The first index of Alpha
Dim iAlpha As Integer = szGreekLetters.IndexOf(ChrW(&H0391))
' The last index of Omega
Dim iomega As Integer = szGreekLetters.LastIndexOf(ChrW(&H03A9))

Console.WriteLine("The Greek letter Alpha first appears at index {0}.", _ 
                  ialpha)
Console.WriteLIne("The Greek letter Omega last appears at index {0}.", _
                  iomega)

Пример 4. Использование указателя на массив символов

В следующем примере показано, как создать новый String объект на основе указателя на массив символов. Пример C# должен быть скомпилирован с /unsafe параметром компилятора.

using namespace System;

void main()
{
   wchar_t characters[] = {L'H',L'e',L'l',L'l',L'o',L' ', 
                           L'W',L'o',L'r',L'l',L'd',L'!',L'\x0000'};

   Char* charPtr = characters;
   String^ value = gcnew String(charPtr);
   Console::WriteLine(value);
}
// The example displays the following output:
//        Hello world!
using System;

public class Example
{
   public static unsafe void Main()
   {
      char[] characters = { 'H', 'e', 'l', 'l', 'o', ' ', 
                            'w', 'o', 'r', 'l', 'd', '!', '\u0000' };
      string value;
      
      fixed (char* charPtr = characters) {
         value = new String(charPtr);
      }                            
      Console.WriteLine(value);
   }
}
// The example displays the following output:
//        Hello world!

Пример 5. Создание экземпляра строки из указателя и диапазона массива

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

using namespace System;


void main()
{
   wchar_t characters[] = {L'H',L'e',L'l',L'l',L'o',L' ', 
                           L'W',L'o',L'r',L'l',L'd',L'!',L'\x0000'};

   Char* charPtr = characters;
   int length = 0;
   Char* iterator = charPtr;

   while (*iterator != '\x0000')
   {
      if (*iterator == L'!' || *iterator == L'.')
         break;
      *iterator++;
      length++;
   }
   String^ value = gcnew String(charPtr, 0, length);
   Console::WriteLine(value);
}
// The example displays the following output:
//      Hello World
using System;

public class Example
{
   public static unsafe void Main()
   {
      char[] characters = { 'H', 'e', 'l', 'l', 'o', ' ', 
                            'w', 'o', 'r', 'l', 'd', '!', '\u0000' };
      String value;
      
      fixed (char* charPtr = characters) {
         int length = 0;
         Char* iterator = charPtr;
   
         while (*iterator != '\x0000')
         {
            if (*iterator == '!' || *iterator == '.')
               break;
            iterator++;
            length++;
         }
         value = new String(charPtr, 0, length);
      }
      Console.WriteLine(value);
   }
}
// The example displays the following output:
//      Hello World

Пример 6. Создание экземпляра строки из указателя на массив байтов со знаком

В следующем примере показано, как можно создать экземпляр String класса с помощью String(SByte*) конструктора.

// Null terminated ASCII characters in a simple char array
char charArray3[4] = {0x41,0x42,0x43,0x00};
char * pstr3 =  &charArray3[ 0 ];
String^ szAsciiUpper = gcnew String( pstr3 );
char charArray4[4] = {0x61,0x62,0x63,0x00};
char * pstr4 =  &charArray4[ 0 ];
String^ szAsciiLower = gcnew String( pstr4,0,sizeof(charArray4) );

// Prints "ABC abc"
Console::WriteLine( String::Concat( szAsciiUpper,  " ", szAsciiLower ) );

// Compare Strings - the result is true
Console::WriteLine( String::Concat(  "The Strings are equal when capitalized ? ", (0 == String::Compare( szAsciiUpper->ToUpper(), szAsciiLower->ToUpper() ) ? (String^)"TRUE" :  "FALSE") ) );

// This is the effective equivalent of another Compare method, which ignores case
Console::WriteLine( String::Concat(  "The Strings are equal when capitalized ? ", (0 == String::Compare( szAsciiUpper, szAsciiLower, true ) ? (String^)"TRUE" :  "FALSE") ) );
unsafe
{
    // Null terminated ASCII characters in an sbyte array
    String szAsciiUpper = null;
    sbyte[] sbArr1 = new sbyte[] { 0x41, 0x42, 0x43, 0x00 };
    // Instruct the Garbage Collector not to move the memory
    fixed(sbyte* pAsciiUpper = sbArr1)
    {
        szAsciiUpper = new String(pAsciiUpper);
    }
    String szAsciiLower = null;
    sbyte[] sbArr2 = { 0x61, 0x62, 0x63, 0x00 };
    // Instruct the Garbage Collector not to move the memory
    fixed(sbyte* pAsciiLower = sbArr2)
    {
        szAsciiLower = new String(pAsciiLower, 0, sbArr2.Length);
    }
    // Prints "ABC abc"
    Console.WriteLine(szAsciiUpper + " " + szAsciiLower);

    // Compare Strings - the result is true
    Console.WriteLine("The Strings are equal when capitalized ? " +
        (String.Compare(szAsciiUpper.ToUpper(), szAsciiLower.ToUpper())==0?"true":"false") );

    // This is the effective equivalent of another Compare method, which ignores case
    Console.WriteLine("The Strings are equal when capitalized ? " +
        (String.Compare(szAsciiUpper, szAsciiLower, true)==0?"true":"false") );
}

String(Char*)

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса String значением, определенным указателем на массив знаков Юникода.

public:
 String(char* value);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public String (char* value);
[System.CLSCompliant(false)]
public String (char* value);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new string : nativeptr<char> -> string
[<System.CLSCompliant(false)>]
new string : nativeptr<char> -> string

Параметры

value
Char*

Указатель на строку знаков в кодировке Юникод, завершающуюся нулевым значением.

Атрибуты

Исключения

Текущий процесс не имеет доступа на чтение ко всем рассматриваемым символам.

value указывает массив, содержащий недопустимый символ Юникода, или value определяет адрес меньше 64 000.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(Char[])

Инициализирует новый экземпляр класса String символами Юникода, заданными в виде массива символов.

public:
 String(cli::array <char> ^ value);
public String (char[] value);
public String (char[]? value);
new string : char[] -> string
Public Sub New (value As Char())

Параметры

value
Char[]

Массив знаков Юникода.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(ReadOnlySpan<Char>)

Инициализирует новый экземпляр класса String символами Юникода, заданными в виде доступного только для чтения диапазона.

public:
 String(ReadOnlySpan<char> value);
public String (ReadOnlySpan<char> value);
new string : ReadOnlySpan<char> -> string
Public Sub New (value As ReadOnlySpan(Of Char))

Параметры

value
ReadOnlySpan<Char>

Доступный только для чтения диапазон символов Юникода.

Применяется к

String(SByte*)

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса String значением, определенным указателем на массив 8-разрядных целых чисел со знаком.

public:
 String(System::SByte* value);
[System.CLSCompliant(false)]
public String (sbyte* value);
public String (sbyte* value);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public String (sbyte* value);
[<System.CLSCompliant(false)>]
new string : nativeptr<sbyte> -> string
new string : nativeptr<sbyte> -> string
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new string : nativeptr<sbyte> -> string

Параметры

value
SByte*

Указатель на массив 8-разрядных целых чисел со знаком, завершающийся нулевым значением. Целые числа интерпретируются с использованием текущей системы кодировки страницы системным кодом (то есть, кодировки, заданной Default).

Атрибуты

Исключения

value имеет значение null.

Не удалось инициализировать новый экземпляр String с помощью value, если предполагается, что value представлен в кодировке ANSI.

Длина новой инициализируемой строки, определяемая символом, завершающимся нулевым значением value, слишком велика для выделения.

value указывает недопустимый адрес.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(Char, Int32)

Инициализирует новый экземпляр класса String значением, полученным путем повторения заданного знака Юникода указанное число раз.

public:
 String(char c, int count);
public String (char c, int count);
new string : char * int -> string
Public Sub New (c As Char, count As Integer)

Параметры

c
Char

Знак Юникода.

count
Int32

Количество повторов c.

Исключения

Значение параметра count меньше нуля.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(Char*, Int32, Int32)

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса String значением, которое определяется заданным указателем на массив знаков Юникода, начальной позицией знака в этом массиве и длиной.

public:
 String(char* value, int startIndex, int length);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public String (char* value, int startIndex, int length);
[System.CLSCompliant(false)]
public String (char* value, int startIndex, int length);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new string : nativeptr<char> * int * int -> string
[<System.CLSCompliant(false)>]
new string : nativeptr<char> * int * int -> string

Параметры

value
Char*

Указатель на массив знаков Юникода.

startIndex
Int32

Начальная позиция в value.

length
Int32

Используемое количество знаков в value.

Атрибуты

Исключения

startIndex или length меньше нуля, value + startIndex приводит к переполнению указателя, или текущий процесс не имеет доступа на чтение ко всем адресуемым символам.

value указывает массив, содержащий недопустимый символ Юникода, или value + startIndex определяет адрес меньше 64 000.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(Char[], Int32, Int32)

Инициализирует новый экземпляр класса String значением, заданным массивом знаков Юникода, начальной позицией знака в пределах данного массива и длиной.

public:
 String(cli::array <char> ^ value, int startIndex, int length);
public String (char[] value, int startIndex, int length);
new string : char[] * int * int -> string
Public Sub New (value As Char(), startIndex As Integer, length As Integer)

Параметры

value
Char[]

Массив знаков Юникода.

startIndex
Int32

Начальная позиция в value.

length
Int32

Используемое количество знаков в value.

Исключения

value имеет значение null.

Значение параметра startIndex или length меньше нуля.

-или-

Сумма startIndex и length больше, чем число элементов в value.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(SByte*, Int32, Int32)

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса String значением, определяемым заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией в пределах массива и длиной.

public:
 String(System::SByte* value, int startIndex, int length);
[System.CLSCompliant(false)]
public String (sbyte* value, int startIndex, int length);
public String (sbyte* value, int startIndex, int length);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public String (sbyte* value, int startIndex, int length);
[<System.CLSCompliant(false)>]
new string : nativeptr<sbyte> * int * int -> string
new string : nativeptr<sbyte> * int * int -> string
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new string : nativeptr<sbyte> * int * int -> string

Параметры

value
SByte*

Указатель на массив 8-разрядных целых чисел со знаком. Целые числа интерпретируются с использованием текущей системы кодировки страницы системным кодом (то есть, кодировки, заданной Default).

startIndex
Int32

Начальная позиция в value.

length
Int32

Используемое количество знаков в value.

Атрибуты

Исключения

value имеет значение null.

Значение параметра startIndex или length меньше нуля.

-или-

Адрес, указанный значениями value + startIndex, слишком велик для текущей платформы, то есть при вычислении адреса произошло переполнение.

-или-

Длина новой инициализируемой строки слишком велика для выделения.

Адрес, указанный значениями value + startIndex, меньше 64 000.

-или-

Не удалось инициализировать новый экземпляр String с помощью value, исходя из предположения, что значение value представлено в кодировке ANSI.

value, startIndex и length совместно определяют недопустимый адрес.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к

String(SByte*, Int32, Int32, Encoding)

Важно!

Этот API несовместим с CLS.

Инициализирует новый экземпляр класса String значением, определенным заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией в пределах этого массива, длиной и объектом Encoding.

public:
 String(System::SByte* value, int startIndex, int length, System::Text::Encoding ^ enc);
[System.CLSCompliant(false)]
public String (sbyte* value, int startIndex, int length, System.Text.Encoding enc);
public String (sbyte* value, int startIndex, int length, System.Text.Encoding enc);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public String (sbyte* value, int startIndex, int length, System.Text.Encoding enc);
[<System.CLSCompliant(false)>]
new string : nativeptr<sbyte> * int * int * System.Text.Encoding -> string
new string : nativeptr<sbyte> * int * int * System.Text.Encoding -> string
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
new string : nativeptr<sbyte> * int * int * System.Text.Encoding -> string

Параметры

value
SByte*

Указатель на массив 8-разрядных целых чисел со знаком.

startIndex
Int32

Начальная позиция в value.

length
Int32

Используемое количество знаков в value.

enc
Encoding

Объект, определяющий способ кодировки массива, на который указывает параметр value. Если значением параметра enc является null, предполагается кодировка ANSI.

Атрибуты

Исключения

value имеет значение null.

Значение параметра startIndex или length меньше нуля.

-или-

Адрес, указанный значениями value + startIndex, слишком велик для текущей платформы, то есть при вычислении адреса произошло переполнение.

-или-

Длина новой инициализируемой строки слишком велика для выделения.

Адрес, указанный значениями value + startIndex, меньше 64 000.

-или-

Не удалось инициализировать новый экземпляр String с помощью value, если предполагается, что value представлен в кодировке enc.

value, startIndex и length совместно определяют недопустимый адрес.

Комментарии

Примечание

Примеры и подробные сведения об использовании этого и других String перегрузок конструктора см. в разделе String Сводка по конструктору.

Применяется к