StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] StringBuilder.Chars[Int32] Property

Definition

Ruft das Zeichen an der angegebenen Zeichenposition in dieser Instanz ab oder legt dieses fest.Gets or sets the character at the specified character position in this instance.

public:
 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

Parameter

index
Int32 Int32 Int32 Int32

Die Position des Zeichens.The position of the character.

Eigenschaftswert

Das Unicode-Zeichen an der Position index.The Unicode character at position index.

Ausnahmen

index liegt beim Festlegen eines Zeichens außerhalb des Bereichs dieser Instanz.index is outside the bounds of this instance while setting a character.

index liegt beim Abrufen eines Zeichens außerhalb des Bereichs dieser Instanz.index is outside the bounds of this instance while getting a character.

Hinweise

Der index -Parameter ist die Position eines Zeichens StringBuilderinnerhalb von.The index parameter is the position of a character within the StringBuilder. Das erste Zeichen in der Zeichenfolge ist am Index 0.The first character in the string is at index 0. Die Länge einer Zeichenfolge entspricht der Anzahl der enthaltenen Zeichen.The length of a string is the number of characters it contains. Das letzte barrierefreie Zeichen einer StringBuilder -Instanz ist am Index Length -1.The last accessible character of a StringBuilder instance is at index Length - 1.

Chars[Int32]ist die Standard Eigenschaft StringBuilder der-Klasse.Chars[Int32] is the default property of the StringBuilder class. In C#handelt es sich um einen Indexer.In C#, it is an indexer. Dies bedeutet, dass einzelne Zeichen aus der Chars[Int32] -Eigenschaft abgerufen werden können, wie im folgenden Beispiel gezeigt, das die Anzahl der alphabetischen Zeichen, Leerzeichen und Interpunktions Zeichen in einer Zeichenfolge zählt.This means that individual characters can be retrieved from the Chars[Int32] 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
      Next    

      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

Leistung und zeichenbasierte IndizierungPerformance and character-based indexing

Das Verwenden von zeichenbasierter Indizierung mit der Chars[Int32]-Eigenschaft kann unter folgenden Bedingungen sehr langsam sein:Using character-based indexing with the Chars[Int32] property can be extremely slow under the following conditions:

  • Die StringBuilder-Instanz ist groß, weil sie beispielsweise aus Zehntausenden von Zeichen besteht.The StringBuilder instance is large (for example, it consists of several tens of thousands of characters).
  • StringBuilder ist „blockweise“ strukturiert.The StringBuilder is "chunky." Das bedeutet, dass wiederholte Aufrufe von Methoden (z.B. StringBuilder.Append) die StringBuilder.Capacity-Eigenschaft des Objekts automatisch erweitert haben und dieser neue Arbeitsspeicherblöcke zugeordnet haben.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.

Die Leistung wird erheblich beeinträchtigt, da für jeden Zugriff auf ein Zeichen die gesamte verknüpfte Liste der Blöcke durchlaufen wird, um den richtigen Puffer für die Indizierung zu suchen.Performance is severely impacted because each character access walks the entire linked list of chunks to find the correct buffer to index into.

Hinweis

Auch für ein „blockweise“ strukturiertes StringBuilder-Objekt kann das Verwenden der Chars[Int32]-Eigenschaft für den indexbasierten Zugriff auf ein oder wenige Zeichen eine negative Auswirkung auf die Leistung haben. Üblicherweise handelt es sich dabei um eine 0(n) -Operation.Even for a large "chunky" StringBuilder object, using the Chars[Int32] 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. Diese erheblichen Auswirkungen auf die Leistung treten auf, wenn die Zeichen im StringBuilder-Objekt durchlaufen werden. Dabei handelt es sich um eine O(n^2) -Operation.The significant performance impact occurs when iterating the characters in the StringBuilder object, which is an O(n^2) operation.

Wenn Leistungsprobleme auftreten, wenn Sie die zeichenbasierte Indizierung mit StringBuilder-Objekten verwenden, können Sie eine der folgenden Problemumgehungen anwenden:If you encounter performance issues when using character-based indexing with StringBuilder objects, you can use any of the following workarounds:

  • Konvertieren Sie die StringBuilder-Instanz zu String, indem Sie die ToString-Methode aufrufen. Greifen Sie dann auf die Zeichen in der Zeichenfolge zu.Convert the StringBuilder instance to a String by calling the ToString method, then access the characters in the string.

  • Kopieren Sie die Inhalte des vorhandenen StringBuilder-Objekts in ein neues StringBuilder-Objekt mit vorab festgelegter Größe.Copy the contents of the existing StringBuilder object to a new pre-sized StringBuilder object. Die Leistung verbessert sich, da das neue StringBuilder-Objekt nicht „blockweise“ strukturiert ist.Performance improves because the new StringBuilder object is not chunky. Beispiel: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)
    
  • Legen Sie die anfängliche Kapazität des StringBuilder-Objekts auf einen Wert fest, der ungefähr der maximal erwarteten Größe entspricht, indem der StringBuilder(Int32)-Konstruktor aufgerufen wird.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. Beachten Sie, dass dadurch der gesamte Arbeitsspeicherblock zugeordnet wird, auch wenn StringBuilder selten die maximale Kapazität erreicht.Note that this allocates the entire block of memory even if the StringBuilder rarely reaches its maximum capacity.

Gilt für:

Siehe auch