System.String コンストラクター

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

オーバーロードされたコンストラクターの構文

文字列コンストラクターは、 ポインター パラメーターのないコンストラクターとポインター パラメーターを持つコンストラクターの 2 つのカテゴリに分類されます。 ポインターを使用するコンストラクターは CLS に準拠していません。 さらに、Visual Basic ではポインターの使用はサポートされていません。C# には、安全でないコンテキストで実行するためにポインターを使用するコードが必要です。 詳しくは、「unsafe」をご覧ください。

オーバーロードの選択に関するその他のガイダンスについては、「どのメソッドを呼び出しますか?」を参照してください

String(Char[] value)
Unicode 文字の配列で示される値に新しいインスタンスを初期化します。 このコンストラクターは Unicode 文字をコピーします (例 2: 文字配列を使用)。

String(Char[] value, Int32 startIndex, Int32 length)
Unicode 文字の配列、その配列内の開始文字位置、および長さ (例 3: 文字配列の一部を使用して 1 文字を繰り返す) で示される値に新しいインスタンスを初期化します。

String(Char c, Int32 count)
指定した Unicode 文字で指定された回数繰り返された値に新しいインスタンスを初期化します (例 3: 文字配列の一部を使用し、1 文字を繰り返します)。

String(char* value)
(CLS 準拠ではない) null 文字 (U+0000 または '\0') で終わる Unicode 文字の配列へのポインターによって示される値に新しいインスタンスを初期化します。 (例 4: 文字配列へのポインターを使用します)。

アクセス許可: SecurityCriticalAttribute直接呼び出し元に対する完全な信頼が必要です。 このメンバーは、部分的に信頼されたコードまたは透過的なコードでは使用できません。

String(char* value, Int32 startIndex, Int32 length)
(CLS 準拠ではない) Unicode 文字の配列へのポインター、その配列内の開始文字位置、および長さによって示される値に新しいインスタンスを初期化します。 コンストラクターは、インデックスからvalue始まり、インデックス + startIndexlengthstartIndex 1 で終わる Unicode 文字をコピーします (例 5: ポインターと配列の範囲から文字列をインスタンス化します)。

アクセス許可: SecurityCriticalAttribute直接呼び出し元に対する完全な信頼が必要です。 このメンバーは、部分的に信頼されたコードまたは透過的なコードでは使用できません。

String(SByte* value)
(CLS 準拠ではない) 8 ビット符号付き整数の配列へのポインターによって示される値に新しいインスタンスを初期化します。 配列は、現在のシステム コード ページ (つまり、指定されたエンコード) を使用してエンコードされた文字列を表すものと見な Encoding.Defaultされます。 コンストラクターは、ポインターによって指定された位置から value 始まり、null 文字 (0x00) に達するまでの文字を処理します (例 6: 符号付きバイト配列へのポインターから文字列をインスタンス化する)。

アクセス許可: SecurityCriticalAttribute直接呼び出し元に対する完全な信頼が必要です。 このメンバーは、部分的に信頼されたコードまたは透過的なコードでは使用できません。

String(SByte* value, Int32 startIndex, Int32 length)
(CLS 準拠ではない) 8 ビット符号付き整数の配列へのポインター、その配列内の開始位置、および長さによって示される値に新しいインスタンスを初期化します。 配列は、現在のシステム コード ページ (つまり、指定されたエンコード) を使用してエンコードされた文字列を表すものと見な Encoding.Defaultされます。 コンストラクターは、-1 で始まる値から文字をstartIndexstartIndexlength + 処理します (例 6: 符号付きバイト配列へのポインターから文字列をインスタンス化します)。

アクセス許可: SecurityCriticalAttribute直接呼び出し元に対する完全な信頼が必要です。 このメンバーは、部分的に信頼されたコードまたは透過的なコードでは使用できません。

String(SByte* value, Int32 startIndex, Int32 length, Encoding enc)
(CLS 準拠ではない) 8 ビット符号付き整数の配列、その配列内の開始位置、長さ、およびオブジェクトへのポインターによって示される値に新しいインスタンスを Encoding 初期化します。

アクセス許可: SecurityCriticalAttribute直接呼び出し元に対する完全な信頼が必要です。 このメンバーは、部分的に信頼されたコードまたは透過的なコードでは使用できません。

パラメーター

ポインター パラメーターを含まないコンストラクターで String 使用されるパラメーターの完全な一覧を次に示します。 各オーバーロードで使用されるパラメーターについては、上記のオーバーロード構文を参照してください。

パラメーター 内容
value Char[] Unicode 文字の配列。
c Char Unicode 文字。
startIndex Int32 新しい文字列の value 最初の文字の開始位置。

既定値: 0
length Int32 新しい文字列に value 含める文字数。

既定値:Array.Length
count Int32 新しい文字列で文字 c が繰り返される回数。 0 の場合 count 、新しいオブジェクトの値は String.Empty.

ポインター パラメーターを含むコンストラクターで String 使用されるパラメーターの完全な一覧を次に示します。 各オーバーロードで使用されるパラメーターについては、上記のオーバーロード構文を参照してください。

パラメーター 説明
value Char*

または

SByte*
Unicode 文字の null で終わる配列または 8 ビット符号付き整数の配列へのポインター。 is null または空の配列の場合value、新しい文字列の値は String.Empty.
startIndex Int32 新しい文字列の最初の文字を定義する配列要素のインデックス。

既定値: 0
length Int32 新しい文字列の作成に使用する配列要素の数。 長さが 0 の場合、コンストラクターは値が < a0/> の String.Empty文字列を作成します。

既定値:Array.Length
enc Encoding 配列のエンコード方法を指定する value オブジェクト。

既定値: Encoding.Defaultまたはシステムの現在の ANSI コード ページ

例外

ポインター パラメーターを含まないコンストラクターによってスローされる例外の一覧を次に示します。

例外 条件 スロー者
ArgumentNullException valuenullです。 String(Char[], Int32, Int32)
ArgumentOutOfRangeException startIndexlengthまたは count 0 未満です。

または

startIndexlength の合計が、value にある要素の数を超えています。

または

count が 0 未満です。
String(Char, Int32)

String(Char[], Int32, Int32)

ポインター パラメーターを含むコンストラクターによってスローされる例外の一覧を次に示します。

例外 条件 スロー者
ArgumentException value は、無効な Unicode 文字を含む配列を指定します。

または

value または value + startIndex 、64K 未満のアドレスを指定します。

または

既定のコード ページ エンコードを使用しないためvaluevalueバイト配列から新しいStringインスタンスを初期化できませんでした。
ポインターを持つすべてのコンストラクター。
ArgumentNullException value が null です。 String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)
ArgumentOutOfRangeException 現在のプロセスは、アドレス指定されたすべての文字に対する読み取りアクセス権を持っているわけではありません。

または

startIndex または length が 0 未満であるか、value + startIndex によりポインターのオーバーフローが発生するか、または現在のプロセスにはすべてのアドレス指定された文字に対する読み取りアクセス許可がありません。

または

新しい文字列の長さが大きすぎて割り当てられません。
ポインターを持つすべてのコンストラクター。
AccessViolationException value、または value + + startIndexlength - 1 は、無効なアドレスを指定します。 String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)

どのメソッドを呼び出しますか?

受信先 通話または使用
文字列を作成します。 文字列リテラルまたは既存の文字列からの割り当て (例 1: 文字列の割り当てを使用)
文字配列全体から文字列を作成します。 String(Char[]) (例 2: 文字配列を使用する)
文字配列の一部から文字列を作成します。 String(Char[], Int32, Int32) (例 3: 文字配列の一部を使用し、1 文字を繰り返す)
同じ文字を複数回繰り返す文字列を作成します。 String(Char, Int32) (例 3: 文字配列の一部を使用し、1 文字を繰り返す)
Unicode またはワイド文字配列へのポインターから文字列を作成します。 String(Char*)
ポインターを使用して、Unicode またはワイド文字配列の一部から文字列を作成します。 String(Char*, Int32, Int32)
C++ char 配列から文字列を作成します。 String(SByte*), String(SByte*, Int32, Int32)

または

String(SByte*, Int32, Int32, Encoding)
ASCII 文字から文字列を作成します。 ASCIIEncoding.GetString

文字列を作成する

文字列をプログラムで作成するために最も一般的に使用される手法は、例 1 に 示すように単純な割り当てです。 この String クラスには、次の値から文字列を作成できる 4 種類のコンストラクター オーバーロードも含まれています。

  • 文字配列 (UTF-16 でエンコードされた文字の配列) から。 配列全体またはその一部の文字から新しい String オブジェクトを作成できます。 コンストラクターは String(Char[]) 、配列内のすべての文字を新しい文字列にコピーします。 コンストラクターはString(Char[], Int32, Int32)、インデックスからインデックス + startIndexstartIndexlength - 1 の文字を新しい文字列にコピーします。 0 の場合 length 、新しい文字列の値は String.Empty.

    コードで同じ値を持つ文字列を繰り返しインスタンス化する場合は、別の方法で文字列を作成することで、アプリケーションのパフォーマンスを向上させることができます。 詳細については、「繰り返し文字列の処理」を参照してください

  • コンストラクターを使用して、0 回、1 回以上重複する 1 文字から String(Char, Int32) 。 0 の場合 count 、新しい文字列の値は String.Empty.

  • またはString(Char*, Int32, Int32)コンストラクターを使用String(Char*)して、null で終わる文字配列へのポインターから。 配列全体または指定した範囲を使用して文字列を初期化できます。 コンストラクターは、指定したポインターから、または指定したポインターからプラスして startIndex 配列の末尾または length 文字に続く Unicode 文字のシーケンスをコピーします。 null ポインターまたはlengthゼロの場合value、コンストラクターは値が < a0/> のString.Empty文字列を作成します。 コピー操作が配列の末尾に進み、配列が null で終わっていない場合、コンストラクターの動作はシステムに依存します。 このような状態は、アクセス違反を引き起こす可能性があります。

    配列に埋め込み null 文字 (U+0000 または '\0') String(Char*, Int32, Int32) が含まれており、オーバーロードが呼び出された場合、文字列インスタンスには、埋め込み null を含む文字が含 length まれます。 次の例は、2 つの null 文字を含む 10 個の要素の配列へのポインターがメソッドに渡された場合の動作を String(Char*, Int32, Int32) 示しています。 アドレスは配列の先頭であり、配列内のすべての要素が文字列に追加されるため、コンストラクターは 2 つの埋め込み null を含む 10 文字の文字列をインスタンス化します。 一方、同じ配列がコンストラクターに String(Char*) 渡された場合、結果は最初の null 文字を含まない 4 文字の文字列になります。

    using System;
    
    public class Example2
    {
       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
    
    #nowarn "9"
    open System
    
    let chars = [| 'a'; 'b'; 'c'; 'd'; '\000'; 'A'; 'B'; 'C'; 'D'; '\000' |]
    let s =
        use chPtr = fixed chars
        String(chPtr, 0, chars.Length)
    
    for ch in s do
        printf $"{uint16 ch:X4} "
    printfn ""
    
    let s2 = 
        use chPtr = fixed chars
        String chPtr    
    
    for ch in s2 do
        printf $"{uint16 ch:X4} "
    printfn ""  
    // The example displays the following output:
    //       0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //       0061 0062 0063 0064
    

    配列には Unicode 文字を含める必要があります。 C++ では、これは、文字配列をマネージド Char[] 型またはアンマネージwchar_t[] 型として定義する必要があることを意味します。

    String(Char*)オーバーロードが呼び出され、配列が null で終了しない場合、またはオーバーロードが呼び出されstartIndex + length、-1 に文字シーケンスに割り当てられたメモリの外部にある範囲が含まれている場合String(Char*, Int32, Int32)、コンストラクターの動作はシステムに依存し、アクセス違反が発生する可能性があります。

  • 符号付きバイト配列へのポインターから。 配列全体または指定した範囲を使用して文字列を初期化できます。 バイトのシーケンスは、既定のコード ページ エンコードを使用して解釈することも、コンストラクター呼び出しでエンコードを指定することもできます。 コンストラクターが null 終端ではない配列全体から文字列をインスタンス化しようとした場合、または配列の範囲がvalue + startIndex配列に + value + startIndexlength割り当てられたメモリの外側にある場合、このコンストラクターの動作はシステムに依存し、アクセス違反が発生する可能性があります。

    パラメーターとして符号付きバイト配列を含む 3 つのコンストラクターは、次の例に示すように、主に C++ char 配列を文字列に変換するように設計されています。

    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) でオーバーロードが呼び出されたバイトが含まれている場合、文字列インスタンスには、埋め込まれた null を含む文字が含まれます length 。 次の例は、2 つの null 文字を含む 10 個の要素の配列へのポインターがメソッドに渡された場合の動作を String(SByte*, Int32, Int32) 示しています。 アドレスは配列の先頭であり、配列内のすべての要素が文字列に追加されるため、コンストラクターは 2 つの埋め込み null を含む 10 文字の文字列をインスタンス化します。 一方、同じ配列がコンストラクターに String(SByte*) 渡された場合、結果は最初の null 文字を含まない 4 文字の文字列になります。

    using System;
    
    public class Example5
    {
       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
    
    #nowarn "9"
    open System
    
    let bytes = 
        [| 0x61y; 0x62y; 0x063y; 0x064y; 0x00y; 0x41y; 0x42y; 0x43y; 0x44y; 0x00y |]
    
    let s =
        use bytePtr = fixed bytes
        String(bytePtr, 0, bytes.Length)
    
    for ch in s do
        printf $"{uint16 ch:X4} "
    printfn ""
    
    let s2 =
        use bytePtr = fixed bytes
        String bytePtr         
    
    for ch in s do
        printf $"{uint16 ch:X4} "
    printfn ""
    // The example displays the following output:
    //       0061 0062 0063 0064 0000 0041 0042 0043 0044 0000
    //       0061 0062 0063 0064
    

    既定の String(SByte*) ANSI コード ページを使用してコンストラクターと String(SByte*, Int32, Int32) コンストラクターが解釈 value されるため、これらのコンストラクターを同じバイト配列で呼び出すと、異なるシステムで異なる値を持つ文字列が作成される場合があります。

繰り返し文字列を処理する

テキストのストリームを解析またはデコードするアプリでは、多くの場合、コンストラクターまたはメソッドをStringBuilder.Append(Char[], Int32, Int32)使用String(Char[], Int32, Int32)して文字のシーケンスを文字列に変換します。 1 つの文字列を作成して再利用するのではなく、同じ値を持つ新しい文字列を繰り返し作成すると、メモリが無駄になります。 コンストラクターを呼び出 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: 文字列の割り当てを使用する

次の例では、文字列リテラルを割り当てて新しい文字列を作成します。 最初の文字列の値を割り当てることで、2 番目の文字列を作成します。 これらは、新しい String オブジェクトをインスタンス化する最も一般的な 2 つの方法です。

using System;

public class Example3
{
   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.
let value1 = "This is a string."
let value2 = value1
printfn "%s" value1
printfn "%s" 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
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
let charArr1 = [| '\u2200'; '\u2202'; '\u200F'; '\u2205' |]
let szMathSymbols = String charArr1

// Unicode Letterlike Symbols
let charArr2 = [| '\u2111'; '\u2118'; '\u2122'; '\u2126' |]
let szLetterLike = String charArr2

// Compare Strings - the result is false
printfn $"The Strings are equal? %b{String.Compare(szMathSymbols, szLetterLike) = 0}"
' 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: 文字配列の一部を使用し、1 文字を繰り返す

次の例では、文字配列の一部から新しい String オブジェクトを作成する方法と、1 つの文字が複数回出現する新しい 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
let szGreekAlpha = String('\u0391',5)
// Create a Unicode String with a Greek Omega character
let szGreekOmega = String([| '\u03A9'; '\u03A9'; '\u03A9' |],2,1)

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

// Examine the result
printfn $"{szGreekLetters}"

// The first index of Alpha
let ialpha = szGreekLetters.IndexOf '\u0391'
// The last index of Omega
let iomega = szGreekLetters.LastIndexOf '\u03A9'

printfn $"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 System;

public class Example4
{
   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!
#nowarn "9"
open System

let characters = 
    [| 'H'; 'e'; 'l'; 'l'; 'o'; ' ' 
       'w'; 'o'; 'r'; 'l'; 'd'; '!'; '\u0000' |]

let value =
    use charPtr = fixed characters
    String charPtr

printfn $"{value}"
// The example displays the following output:
//        Hello world!

例 5: ポインターと配列の範囲から文字列をインスタンス化する

次の例では、ピリオドまたは感嘆符の文字配列の要素を調べます。 見つかった場合は、句読点記号の前にある配列内の文字から文字列をインスタンス化します。 そうでない場合は、配列の内容全体を使用して文字列をインスタンス化します。 C# の例は、コンパイラ スイッチを使用してコンパイルする /unsafe 必要があります。

using System;

public class Example1
{
   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
#nowarn "9"
open System
open FSharp.NativeInterop

let characters = 
    [| 'H'; 'e'; 'l'; 'l'; 'o'; ' '
       'w'; 'o'; 'r'; 'l'; 'd'; '!'; '\u0000' |]

[<EntryPoint>]
let main _ =
    use charPtr = fixed characters
    let mutable length = 0
    let mutable iterator = charPtr
    let mutable broken = false
    while not broken && NativePtr.read iterator <> '\u0000' do
        if NativePtr.read iterator = '!' || NativePtr.read iterator = '.' then
            broken <- true
        else
            iterator <- NativePtr.add iterator 1
            length <- length + 1
    String(charPtr, 0, length)
    |> printfn "%s"
    0
// The example displays the following output:
//      Hello World

例 6: 符号付きバイト配列へのポインターから文字列をインスタンス化する

次の例では、コンストラクターを使用してクラスのインスタンスを作成する String 方法を String(SByte*) 示します。

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") );
}
// Null terminated ASCII characters in an sbyte array
let szAsciiUpper =
    let sbArr1 = [| 0x41y; 0x42y; 0x43y; 0x00y |]
    // Instruct the Garbage Collector not to move the memory
    use pAsciiUpper = fixed sbArr1
    String pAsciiUpper

let szAsciiLower =
    let sbArr2 = [| 0x61y; 0x62y; 0x63y; 0x00y |]
    // Instruct the Garbage Collector not to move the memory
    use pAsciiLower = fixed sbArr2 
    String(pAsciiLower, 0, sbArr2.Length)

// Prints "ABC abc"
printfn $"{szAsciiUpper} {szAsciiLower}"

// Compare Strings - the result is true
printfn $"The Strings are equal when capitalized ? %b{String.Compare(szAsciiUpper.ToUpper(), szAsciiLower.ToUpper()) = 0}"

// This is the effective equivalent of another Compare method, which ignores case
printfn $"The Strings are equal when capitalized ? %b{String.Compare(szAsciiUpper, szAsciiLower, true) = 0}"