この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

String コンストラクター

 

公開日: 2016年10月

String クラスの新しいインスタンスを初期化します。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

名前説明
System_CAPS_pubmethodString(Char*)

String クラスの新しいインスタンスを初期化し、指定した Unicode 文字配列を指すポインターにより示される値に設定します。

System_CAPS_pubmethodString(Char*, Int32, Int32)

String クラスの新しいインスタンスを初期化し、Unicode 文字の配列を指す指定のポインター、配列内の開始文字位置、および長さにより示される値に設定します。

System_CAPS_pubmethodString(Char, Int32)

String クラスの新しいインスタンスを初期化し、指定した回数だけ繰り返した指定の Unicode 文字が示す値に設定します。

System_CAPS_pubmethodString(Char[])

String クラスの新しいインスタンスを初期化し、Unicode 文字の配列により示される値に設定します。

System_CAPS_pubmethodString(Char[], Int32, Int32)

String クラスの新しいインスタンスを初期化し、Unicode 文字の配列、配列内の開始文字位置、および長さにより示される値に設定します。

System_CAPS_pubmethodString(SByte*)

String クラスの新しいインスタンスを初期化し、8 ビット符号付き整数の配列を指すポインターにより示される値に設定します。

System_CAPS_pubmethodString(SByte*, Int32, Int32)

String クラスの新しいインスタンスを初期化し、8 ビット符号付き整数の配列を指す指定のポインター、配列内の開始位置、および長さにより示される値に設定します。

System_CAPS_pubmethodString(SByte*, Int32, Int32, Encoding)

String クラスの新しいインスタンスを初期化し、8 ビット符号付き整数の配列を指す指定のポインター、配列内の開始位置、長さ、および Encoding オブジェクトにより示される値に設定します。

文字列のコンス トラクターは 2 つのカテゴリに分類されます。 ポインター パラメーターを指定しないと、ポインター パラメーターを使用します。 ポインターを使用するコンス トラクターは CLS 準拠ではありません。 さらに、Visual Basic は、ポインターの使用をサポートしていませんし、C# の場合、unsafe コンテキストで実行するポインターを使用したコードが必要です。 詳細については、「unsafe (C# リファレンス)」を参照してください。

オーバー ロードを選択するための追加のガイダンスについては、次を参照してくださいどのメソッドが呼び出ししますか?。

String(Char[] value)

Unicode 文字の配列により示される値の新しいインスタンスを初期化します。 このコンス トラクターは、Unicode 文字をコピー ()。

String(Char[] value, Int32 startIndex, Int32 length)

配列、および長さ内の開始文字位置の Unicode 文字の配列により示される値に新しいインスタンスを初期化します ()。

String(Char c, Int32 count)

指定した Unicode 文字で示される値の新しいインスタンスを初期化しますが、指定した回数だけを繰り返す ()。

String(char* value)

(非 CLS 準拠)は null 文字で終了する Unicode 文字の配列を指すポインターにより示される値に新しいインスタンスを初期化します (u+0000 と '\0')。 (example).

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

String(char* value, Int32 startIndex, Int32 length)

(非 CLS 準拠) Unicode 文字配列、および長さ内の開始文字位置の配列を指すポインターにより示される値に新しいインスタンスを初期化します。 コンス トラクターから Unicode 文字をコピーするvalueインデックスから始まりますstartIndex日と終了インデックスにstartIndex+ length – 1 ()。

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

String(SByte* value)

(非 CLS 準拠) 8 ビット符号付き整数の配列を指すポインターにより示される値に新しいインスタンスを初期化します。 配列を現在のシステム コード ページを使用してエンコードされた文字列を表すと想定されます (つまりで指定するエンコードEncoding.Default)。 コンス トラクターから文字を処理するvaluenull 文字 (0x00) に到達するまで、ポインターは、指定された場所から起動 ()。

アクセス許可: 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ポインター パラメーターを含まないコンス トラクターです。 各オーバー ロードで使用するパラメーター、上記のオーバー ロードの構文を参照してください。

パラメーター

Type

説明

value

Char[]

Unicode 文字の配列。

c

Char

Unicode 文字。

startIndex

Int32

内の開始位置valueの新しい文字列の最初の文字です。

既定値: 0

length

Int32

文字数value新しい文字列に含めます。

既定値:Array.Length

count

Int32

回数文字c新しい文字列で繰り返されます。 場合count0 の場合は、新しいオブジェクトの値はString.Emptyします。

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

パラメーター

Type

説明

value

Char*

または

SByte*

Unicode 文字の null で終わる配列、または 8 ビット符号付き整数の配列へのポインター。 場合valuenullか、空の配列の新しい文字列の値がString.Emptyです。

startIndex

Int32

新しい文字列の最初の文字を定義する配列要素のインデックス。

既定値: 0

length

Int32

使用して、新しい文字列を作成する配列要素の数。 長さが 0 の場合は、コンス トラクターは、値の文字列を作成String.Emptyです。

既定値:Array.Length

enc

Encoding

オブジェクトを指定する方法、value配列をエンコードします。

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

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

Exception

Condition

によってスローされます。

ArgumentNullException

valuenull です。

String(Char[], Int32, Int32)

ArgumentOutOfRangeException

startIndexlength、またはcountが 0 未満です。

または

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

または

count が 0 未満です。

String(Char, Int32)

String(Char[], Int32, Int32)

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

Exception

Condition

によってスローされます。

ArgumentException

value無効な Unicode 文字を格納する配列を指定します。

または

valueまたはvalue+ startIndex64 K 未満であるアドレスを指定します。

または

新しいStringからインスタンスを初期化できませんでした、valueバイト配列のためvalue既定コード ページ エンコーディングは使用されません。

ポインターの使用のすべてのコンス トラクターです。

ArgumentNullException

value が null です。

String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)

ArgumentOutOfRangeException

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

または

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

または

新しい文字列の長さが大きすぎて割り当てられません。

ポインターの使用のすべてのコンス トラクターです。

AccessViolationException

value、またはvalue+ startIndex + length – 1、無効なアドレスを指定します。

String(SByte*)

String(SByte*, Int32, Int32)

String(SByte*, Int32, Int32, Encoding)

To

呼び出しまたは使用します。

文字列を作成します。

文字列リテラルまたは既存の文字列からの割り当て ()

全体の文字配列から文字列を作成します。

String(Char[])(example)

文字配列の部分から文字列を作成します。

String(Char[], Int32, Int32)(example)

同じ文字が複数回繰り返されている文字列を作成します。

String(Char, Int32)(example)

Unicode またはワイド文字配列へのポインターから文字列を作成します。

String(Char*)

Unicode またはワイド文字配列の部分から文字列を作成するには、そのポインターを使用します。

String(Char*, Int32, Int32)

C++ から文字列を作成してchar配列。

String(SByte*), String(SByte*, Int32, Int32)

または

String(SByte*, Int32, Int32, Encoding)

ASCII 文字の文字列を作成します。

ASCIIEncoding.GetString

最もよく使用される手法単純代入では、文字列をプログラムで作成するために示すようにこの例です。 Stringクラスには、次の値から文字列を作成するのに便利なコンス トラクター オーバー ロードの 4 つの型も含まれています。

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

    コードは、同じ値を持つ文字列に繰り返しインスタンスを作成する場合、は、その他の文字列を作成する方法を使用して、アプリケーションのパフォーマンスを向上できます。 詳細については、次を参照してください。反復的な文字列を処理するです。

  • 1 つの文字重複 0、1 つ、または他にも使用して、String(Char, Int32)コンス トラクターです。 場合count0 の場合は、新しい文字列の値はString.Emptyします。

  • Null で終わる文字配列へのポインターから次を使用して、String(Char*)またはString(Char*, Int32, Int32)コンス トラクターです。 文字列を初期化するためには、配列全体または指定された範囲のいずれかを使用できます。 コンス トラクターは、指定したポインターから、またはプラスの指定されたポインターから始まる Unicode 文字のシーケンスをコピーするstartIndexまたは配列の末尾を続行してlength文字です。 場合valuenull ポインターまたはlength0 の場合は、コンス トラクターは、値がある文字列を作成するString.Emptyです。 コピー操作は、配列の末尾にプロセスが実行され、配列が null で終わる、コンス トラクターの動作がシステムに依存します。 このような条件アクセス違反が発生する可能性があります。

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

    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("{0:X4} ", Convert.ToUInt16(ch));
          Console.WriteLine();
    
          fixed(char* chPtr = chars) {
             s = new string(chPtr);         
          }
    
          foreach (var 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
    

    配列には、Unicode 文字を含める必要があります。 C++ では、つまり文字配列でなければならないこと、管理対象として定義されているChar型またはアンマネージwchar_t型です。

    場合、String(Char*)オーバー ロードが呼び出され、配列が null で終わる場合、または、String(Char*, Int32, Int32)オーバー ロードが呼び出されたとstartIndex+ length-1 には文字のシーケンスに割り当てられたメモリの外側に範囲が含まれています、コンス トラクターの動作はシステムに依存する、およびアクセス違反が発生する可能性があります。 さらに、Intel Itanium プロセッサ上への呼び出し、String(Char*, Int32, Int32)コンス トラクターがスローする可能性があります、DataMisalignedException例外。 この場合、呼び出し、String(Char[], Int32, Int32)代わりにします。

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

    パラメーターとして符号付きバイト配列を含む 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
    

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

    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("{0:X4} ", Convert.ToUInt16(ch));
    
          Console.WriteLine();    
    
          fixed(sbyte* bytePtr = bytes) {
             s = new string(bytePtr);         
          }
    
          foreach (var 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
    

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

解析、または多くの場合、テキストのストリームをデコードするアプリを使用して、String(Char[], Int32, Int32)コンス トラクターまたはStringBuilder.Append(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)メソッド テーブルに、トークンを挿入して、対応する文字列を取得します。

次の例では、文字列リテラルを割り当てることによって新しい文字列を作成します。 最初の文字列の値を代入によって 2 番目の文字列を作成します。 これらの新しいインスタンスを作成する 2 つの最も一般的な方法は、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.

次の例では、新しい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") );

次の例では、新規作成Stringオブジェクトを新規作成方法と、文字配列の部分からStringを 1 つの文字の複数の発生を含むオブジェクト。

// 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.");

次の例では、新しいString文字の配列へのポインターからのオブジェクト。 C# の例を使用してコンパイルする必要があります、/unsafeコンパイラ スイッチ。

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!

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

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

次の例では、インスタンスを作成する方法を示しています、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") );
}

.NET Framework

すべてのオーバー ロードではサポートされて: 4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

すべてのオーバー ロードではサポートされて: 4、3.5 SP1

汎用性のあるクラス ライブラリ

すべてのオーバー ロードせず、 SByte*パラメーターがサポートされています。

Windows ストア アプリ用 .NET

なくすべてのオーバー ロード、 SByte*でパラメーターがサポートされます Windows 8。

トップに戻る
表示: