StringBuilder.Chars[Int32] プロパティ


このインスタンス内の指定した文字位置の文字を取得または設定します。Gets or sets the character at the specified character position in this instance.

 property char default[int] { char get(int index); void set(int index, char value); };
public char this[int index] { get; set; }
member this.Chars(int) : char with get, set
Default Public Property Chars(index As Integer) As Char



文字の位置。The position of the character.



index 位置の Unicode 文字。The Unicode character at position index.


文字の設定において、index がこのインスタンスの境界外です。index is outside the bounds of this instance while setting a character.

文字の取得において、index がこのインスタンスの境界外です。index is outside the bounds of this instance while getting a character.


indexパラメーターは、内の文字の位置です StringBuilderThe index parameter is the position of a character within the StringBuilder. 文字列の最初の文字は、インデックス0の位置にあります。The first character in the string is at index 0. 文字列の長さは、文字列に含まれる文字数です。The length of a string is the number of characters it contains. インスタンスの最後にアクセス可能な文字 StringBuilder は、インデックス Length -1 になります。The last accessible character of a StringBuilder instance is at index Length - 1.

Chars[] は、クラスの既定のプロパティです StringBuilderChars[] is the default property of the StringBuilder class. C# では、これはインデクサーです。In C#, it is an indexer. これは、次の例に示すように、プロパティから個々の文字を取得できることを意味します。この例では、 Chars[] 文字列内の英字、空白、および区切り文字の数をカウントします。This means that individual characters can be retrieved from the Chars[] property as shown in the following example, which counts the number of alphabetic, white-space, and punctuation characters in a string.

using System;
using System.Text;

public class Example
   public static void Main()
      int nAlphabeticChars = 0;
      int nWhitespace = 0;
      int nPunctuation = 0;  
      StringBuilder sb = new StringBuilder("This is a simple sentence.");
      for (int ctr = 0; ctr < sb.Length; ctr++) {
         char ch = sb[ctr];
         if (Char.IsLetter(ch)) { nAlphabeticChars++;  continue; }
         if (Char.IsWhiteSpace(ch)) { nWhitespace++;  continue; }
         if (Char.IsPunctuation(ch)) nPunctuation++;  

      Console.WriteLine("The sentence '{0}' has:", sb);
      Console.WriteLine("   Alphabetic characters: {0}", nAlphabeticChars);
      Console.WriteLine("   White-space characters: {0}", nWhitespace);
      Console.WriteLine("   Punctuation characters: {0}", nPunctuation);
// The example displays the following output:
//       The sentence 'This is a simple sentence.' has:
//          Alphabetic characters: 21
//          White-space characters: 4
//          Punctuation characters: 1
Imports System.Text

Module Example
   Public Sub Main()
      Dim nAlphabeticChars As Integer = 0
      Dim nWhitespace As Integer = 0
      Dim nPunctuation As Integer = 0  
      Dim sb As New StringBuilder("This is a simple sentence.")
      For ctr As Integer = 0 To sb.Length - 1
         Dim ch As Char = sb(ctr)
         If Char.IsLetter(ch) Then nAlphabeticChars += 1 : Continue For
         If Char.IsWhiteSpace(ch) Then nWhitespace += 1 : Continue For
         If Char.IsPunctuation(ch) Then nPunctuation += 1

      Console.WriteLine("The sentence '{0}' has:", sb)
      Console.WriteLine("   Alphabetic characters: {0}", nAlphabeticChars)
      Console.WriteLine("   White-space characters: {0}", nWhitespace)
      Console.WriteLine("   Punctuation characters: {0}", nPunctuation)
   End Sub
End Module
' The example displays the following output:
'       The sentence 'This is a simple sentence.' has:
'          Alphabetic characters: 21
'          White-space characters: 4
'          Punctuation characters: 1

パフォーマンスと文字ベースのインデックス作成Performance and character-based indexing

Chars[] プロパティで文字ベースのインデックス付けを使用すると、次の条件下では非常に遅くなることがあります。Using character-based indexing with the Chars[] property can be extremely slow under the following conditions:

  • StringBuilder インスタンスが大きい (たとえば、数万文字が含まれている)。The StringBuilder instance is large (for example, it consists of several tens of thousands of characters).
  • StringBuilder が "チャンク化" している。The StringBuilder is "chunky." つまり、StringBuilder.Append などのメソッドの反復的な呼び出しにより、オブジェクトの StringBuilder.Capacity プロパティが自動的に展開され、メモリの新しいチャンクがそれに割り当てられています。That is, repeated calls to methods such as StringBuilder.Append have automatically expanded the object's StringBuilder.Capacity property and allocated new chunks of memory to it.

文字にアクセスするたびに、チャンクのリンク リスト全体が走査されて、インデックスを付ける適切なバッファーが検索されるため、パフォーマンスが著しく低下します。Performance is severely impacted because each character access walks the entire linked list of chunks to find the correct buffer to index into.


大きな "チャンク化" した StringBuilder オブジェクトの場合でも、1 つまたは少数の文字へのインデックス ベースのアクセスに Chars[] プロパティを使うと、パフォーマンスへの影響はごくわずかです。通常、これは 0(n) 操作です。Even for a large "chunky" StringBuilder object, using the Chars[] property for index-based access to one or a small number of characters has a negligible performance impact; typically, it is an 0(n) operation. StringBuilder オブジェクト内の文字を反復処理するときは、パフォーマンスに大きな影響が発生します。これは、O(n^2) 操作でます。The significant performance impact occurs when iterating the characters in the StringBuilder object, which is an O(n^2) operation.

StringBuilder オブジェクトで文字ベースのインデックス付けを使うときにパフォーマンスの問題が発生する場合は、次のいずれかの回避策を使うことができます。If you encounter performance issues when using character-based indexing with StringBuilder objects, you can use any of the following workarounds:

  • ToString メソッドを呼び出して StringBuilder インスタンスを String に変換した後、文字列内の文字にアクセスします。Convert the StringBuilder instance to a String by calling the ToString method, then access the characters in the string.

  • 既存の StringBuilder オブジェクトの内容を、事前にサイズを設定した新しい StringBuilder オブジェクトにコピーします。Copy the contents of the existing StringBuilder object to a new pre-sized StringBuilder object. 新しい StringBuilder オブジェクトはチャンク化していないため、パフォーマンスが向上します。Performance improves because the new StringBuilder object is not chunky. 次に例を示します。For example:

    // sbOriginal is the existing StringBuilder object
    var sbNew = new StringBuilder(sbOriginal.ToString(), sbOriginal.Length);
    ' sbOriginal is the existing StringBuilder object
    Dim sbNew = New StringBuilder(sbOriginal.ToString(), sbOriginal.Length)
  • StringBuilder(Int32) コンストラクターを呼び出して、StringBuilder オブジェクトの初期容量を、予想される最大サイズにほぼ等しい値に設定します。Set the initial capacity of the StringBuilder object to a value that is approximately equal to its maximum expected size by calling the StringBuilder(Int32) constructor. このようにすると、StringBuilder が最大容量に達することがほとんどない場合であっても、メモリ ブロック全体が割り当てられることに注意してください。Note that this allocates the entire block of memory even if the StringBuilder rarely reaches its maximum capacity.