System.String-Konstruktor
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Syntax des überladenen Konstruktors
Zeichenfolgenkonstruktoren sind in zwei Kategorien unterteilt: diejenigen ohne Zeigerparameter und solche mit Zeigerparametern. Die Konstruktoren, die Zeiger verwenden, sind nicht CLS-kompatibel. Darüber hinaus unterstützt Visual Basic die Verwendung von Zeigern nicht, und C# erfordert Code, der Zeiger zum Ausführen in einem unsicheren Kontext verwendet. Weitere Informationen finden Sie unter unsafe.
Weitere Anleitungen zum Auswählen einer Überladung finden Sie unter Welche Methode kann ich aufrufen?.
String(Char[] value)
Initialisiert die neue Instanz auf den Wert, der durch ein Array von Unicode-Zeichen angegeben wird. Dieser Konstruktor kopiert Unicode-Zeichen(Beispiel 2: Verwenden eines Zeichenarrays).
String(Char[] value, Int32 startIndex, Int32 length)
Initialisiert die neue Instanz auf den Wert, der durch ein Array von Unicode-Zeichen, eine Anfangszeichenposition innerhalb dieses Arrays und eine Länge angegeben wird (Beispiel 3: Verwenden eines Teils eines Zeichenarrays und Wiederholen eines einzelnen Zeichens).
String(Char c, Int32 count)
Initialisiert die neue Instanz auf den Wert, der durch ein angegebenes Unicode-Zeichen angegeben wird, wiederholt eine bestimmte Anzahl von Malen (Beispiel 3: Verwenden eines Teils eines Zeichenarrays und Wiederholen eines einzelnen Zeichens).
String(char* value)
(Nicht CLS-kompatibel) Initialisiert die neue Instanz auf den Wert, der durch einen Zeiger auf ein Array von Unicode-Zeichen angegeben wird, das durch ein Nullzeichen (U+0000 oder '\0' beendet wird). (Beispiel 4: Verwenden eines Zeigers auf ein Zeichenarray).
Berechtigung: SecurityCriticalAttribute, erfordert volle Vertrauensstellung für den unmittelbaren Anrufer. Dieses Element kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.
String(char* value, Int32 startIndex, Int32 length)
(Nicht CLS-kompatibel) Initialisiert die neue Instanz auf den Von einem Zeiger angegebenen Wert auf ein Array von Unicode-Zeichen, eine Anfangszeichenposition innerhalb dieses Arrays und eine Länge. Der Konstruktor kopiert die Unicode-Zeichen beginnend am Index und endet am Index + startIndex
length
- 1 (Beispiel 5: Instanziieren einer Zeichenfolge von einem Zeiger und einem Bereich eines Arrays).startIndex
value
Berechtigung: SecurityCriticalAttribute, erfordert volle Vertrauensstellung für den unmittelbaren Anrufer. Dieses Element kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.
String(SByte* value)
(Nicht CLS-kompatibel) Initialisiert die neue Instanz auf den Wert, der durch einen Zeiger auf ein Array mit 8-Bit-ganzzahlen angegeben ist. Das Array wird angenommen, um eine Zeichenfolge darzustellen, die mit der aktuellen Systemcodeseite codiert ist (d. a. die durch Encoding.Default). Der Konstruktor verarbeitet Zeichen von value
der Vom Zeiger angegebenen Position, bis ein NULL-Zeichen (0x00) erreicht ist (Beispiel 6: Instanziieren einer Zeichenfolge von einem Zeiger auf ein signiertes Bytearray).
Berechtigung: SecurityCriticalAttribute, erfordert volle Vertrauensstellung für den unmittelbaren Anrufer. Dieses Element kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.
String(SByte* value, Int32 startIndex, Int32 length)
(Nicht CLS-kompatibel) Initialisiert die neue Instanz auf den Wert, der von einem Zeiger auf ein Array mit 8-Bit-ganzzahlen, einer Anfangsposition innerhalb dieses Arrays und einer Länge angegeben wird. Das Array wird angenommen, um eine Zeichenfolge darzustellen, die mit der aktuellen Systemcodeseite codiert ist (d. a. die durch Encoding.Default). Der Konstruktor verarbeitet Zeichen vom Wert ab und startIndex
endet mit startIndex
+ length
- 1 (Beispiel 6: Instanziieren einer Zeichenfolge von einem Zeiger auf ein signiertes Bytearray).
Berechtigung: SecurityCriticalAttribute, erfordert volle Vertrauensstellung für den unmittelbaren Anrufer. Dieses Element kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.
String(SByte* value, Int32 startIndex, Int32 length, Encoding enc)
(Nicht CLS-kompatibel) Initialisiert die neue Instanz auf den Wert, der durch einen Zeiger auf ein Array mit 8-Bit-Ganzzahlen, eine Anfangsposition innerhalb dieses Arrays, eine Länge und ein Encoding Objekt angegeben wird.
Berechtigung: SecurityCriticalAttribute, erfordert volle Vertrauensstellung für den unmittelbaren Anrufer. Dieses Element kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.
Parameter
Nachfolgend finden Sie eine vollständige Liste der Parameter, die von String Konstruktoren verwendet werden, die keinen Zeigerparameter enthalten. Die parameter, die von jeder Überladung verwendet werden, finden Sie in der obigen Überladungssyntax.
Parameter | Typ | Beschreibung |
---|---|---|
value |
Char[] | Ein Array von Unicode-Zeichen. |
c |
Char | Ein Unicode-Zeichen. |
startIndex |
Int32 | Die Anfangsposition des value ersten Zeichens in der neuen Zeichenfolge.Standardwert: 0 |
length |
Int32 | Die Anzahl der Zeichen, die value in die neue Zeichenfolge eingeschlossen werden sollen.Standardwert: Array.Length |
count |
Int32 | Die Anzahl der Wiederholungen des Zeichens c in der neuen Zeichenfolge. Wenn count null ist, lautet String.Emptyder Wert des neuen Objekts . |
Hier ist eine vollständige Liste der Parameter, die von String Konstruktoren verwendet werden, die einen Zeigerparameter enthalten. Die parameter, die von jeder Überladung verwendet werden, finden Sie in der obigen Überladungssyntax.
Parameter | Typ | Beschreibung |
---|---|---|
value |
Char* Oder SByte* |
Ein Zeiger auf ein mit Null beendetes Array von Unicode-Zeichen oder ein Array mit 8-Bit-Ganzzahlen. Wenn value es sich um ein leeres Array handelt null , lautet String.Emptyder Wert der neuen Zeichenfolge . |
startIndex |
Int32 | Der Index des Arrayelements, das das erste Zeichen in der neuen Zeichenfolge definiert. Standardwert: 0 |
length |
Int32 | Die Anzahl der Arrayelemente, die zum Erstellen der neuen Zeichenfolge verwendet werden sollen. Wenn die Länge null ist, erstellt der Konstruktor eine Zeichenfolge, deren Wert lautet String.Empty. Standardwert: Array.Length |
enc |
Encoding | Ein Objekt, das angibt, wie das value Array codiert wird.Standardwert: Encoding.Defaultoder die aktuelle ANSI-Codeseite des Systems |
Ausnahmen
Nachfolgend finden Sie eine Liste von Ausnahmen, die von Konstruktoren ausgelöst werden, die keine Zeigerparameter enthalten.
Exception | Bedingung | Ausgelöst von |
---|---|---|
ArgumentNullException | value ist null . |
String(Char[], Int32, Int32) |
ArgumentOutOfRangeException | startIndex , length oder count ist kleiner als 0 (null).Oder Die Summe von startIndex und length ist größer als die Anzahl von Elementen in value .Oder count ist kleiner als 0 (null). |
String(Char, Int32) String(Char[], Int32, Int32) |
Hier ist eine Liste von Ausnahmen, die von Konstruktoren ausgelöst werden, die Zeigerparameter enthalten.
Exception | Bedingung | Ausgelöst von |
---|---|---|
ArgumentException | value Gibt ein Array an, das ein ungültiges Unicode-Zeichen enthält.Oder value oder value + startIndex gibt eine Adresse an, die kleiner als 64 KB ist.Oder Eine neue String Instanz konnte nicht aus dem value Bytearray initialisiert werden, da value die Standardcodeseitencodierung nicht verwendet wird. |
Alle Konstruktoren mit Zeigern. |
ArgumentNullException | value ist NULL. |
String(SByte*) String(SByte*, Int32, Int32) String(SByte*, Int32, Int32, Encoding) |
ArgumentOutOfRangeException | Der aktuelle Prozess hat keinen Lesezugriff auf alle adressierten Zeichen. Oder startIndex oder length ist kleiner als 0 (null), value + startIndex verursacht einen Zeigerüberlauf oder der aktuelle Prozess hat keinen Lesezugriff auf alle adressierten Zeichen.Oder Die Länge der neuen Zeichenfolge ist zu groß, um sie zuzuweisen. |
Alle Konstruktoren mit Zeigern. |
AccessViolationException | value , oder value + + startIndex length - 1, gibt eine ungültige Adresse an. |
String(SByte*) String(SByte*, Int32, Int32) String(SByte*, Int32, Int32, Encoding) |
Welche Methode wird aufgerufen?
Beschreibung | Anrufen oder Verwenden |
---|---|
Erstellen Sie eine Zeichenfolge. | Zuweisung aus einem Zeichenfolgenliteral oder einer vorhandenen Zeichenfolge (Beispiel 1: Zeichenfolgenzuweisung verwenden) |
Erstellen Sie eine Zeichenfolge aus einem gesamten Zeichenarray. | String(Char[]) (Beispiel 2: Verwenden eines Zeichenarrays) |
Erstellen Sie eine Zeichenfolge aus einem Teil eines Zeichenarrays. | String(Char[], Int32, Int32) (Beispiel 3: Verwenden eines Teils eines Zeichenarrays und Wiederholen eines einzelnen Zeichens) |
Erstellen Sie eine Zeichenfolge, die dasselbe Zeichen mehrmals wiederholt. | String(Char, Int32) (Beispiel 3: Verwenden eines Teils eines Zeichenarrays und Wiederholen eines einzelnen Zeichens) |
Erstellen Sie eine Zeichenfolge von einem Zeiger auf ein Unicode- oder breites Zeichenarray. | String(Char*) |
Erstellen Sie eine Zeichenfolge aus einem Teil eines Unicode- oder breiten Zeichenarrays mithilfe des Zeigers. | String(Char*, Int32, Int32) |
Erstellen Sie eine Zeichenfolge aus einem C++ char -Array. |
String(SByte*), String(SByte*, Int32, Int32) Oder String(SByte*, Int32, Int32, Encoding) |
Erstellen Sie eine Zeichenfolge aus ASCII-Zeichen. | ASCIIEncoding.GetString |
Erstellen von Zeichenfolgen
Die am häufigsten verwendete Technik zum programmgesteuerten Erstellen von Zeichenfolgen ist eine einfache Zuweisung, wie in Beispiel 1 dargestellt. Die String Klasse enthält auch vier Typen von Konstruktorüberladungen, mit denen Sie Zeichenfolgen aus den folgenden Werten erstellen können:
Aus einem Zeichenarray (ein Array mit UTF-16-codierten Zeichen). Sie können ein neues String Objekt aus den Zeichen im gesamten Array oder einem Teil davon erstellen. Der String(Char[]) Konstruktor kopiert alle Zeichen im Array in die neue Zeichenfolge. Der String(Char[], Int32, Int32) Konstruktor kopiert die Zeichen von Index in Index +
startIndex
startIndex
length
- 1 in die neue Zeichenfolge. Wennlength
null ist, lautet String.Emptyder Wert der neuen Zeichenfolge .Wenn Ihr Code Zeichenfolgen mit demselben Wert wiederholt instanziiert, können Sie die Anwendungsleistung mithilfe einer alternativen Möglichkeit zum Erstellen von Zeichenfolgen verbessern. Weitere Informationen finden Sie unter Behandeln sich wiederholender Zeichenfolgen.
Aus einem einzelnen Zeichen, das mit dem String(Char, Int32) Konstruktor dupliziert wird, wird ein oder mehrere Male dupliziert. Wenn
count
null ist, lautet String.Emptyder Wert der neuen Zeichenfolge .Von einem Zeiger auf ein durch Null beendetes Zeichenarray mithilfe des oder String(Char*, Int32, Int32) des String(Char*) Konstruktors. Entweder das gesamte Array oder ein angegebener Bereich kann zum Initialisieren der Zeichenfolge verwendet werden. Der Konstruktor kopiert eine Abfolge von Unicode-Zeichen beginnend mit dem angegebenen Zeiger oder vom angegebenen Zeiger plus
startIndex
und fortgesetzt bis zum Ende des Arrays oder fürlength
Zeichen. Wennvalue
es sich um einen Nullzeiger handelt oderlength
null ist, erstellt der Konstruktor eine Zeichenfolge, deren Wert lautet String.Empty. Wenn der Kopiervorgang am Ende des Arrays fortgesetzt wird und das Array nicht null beendet ist, ist das Konstruktorverhalten systemabhängig. Eine solche Bedingung kann zu einer Zugriffsverletzung führen.Wenn das Array eingebettete Nullzeichen (U+0000 oder '\0) enthält und die String(Char*, Int32, Int32) Überladung aufgerufen wird, enthält
length
die Zeichenfolgeninstanz Zeichen einschließlich eingebetteter Nullen. Das folgende Beispiel zeigt, was passiert, wenn ein Zeiger auf ein Array von 10 Elementen mit zwei NULL-Zeichen an die String(Char*, Int32, Int32) Methode übergeben wird. Da die Adresse der Anfang des Arrays ist und alle Elemente im Array der Zeichenfolge hinzugefügt werden sollen, instanziiert der Konstruktor eine Zeichenfolge mit zehn Zeichen, einschließlich zwei eingebetteter Nullen. Wenn dasselbe Array hingegen an den Konstruktor übergeben wird, handelt es sich bei dem String(Char*) Ergebnis um eine vierstellige Zeichenfolge, die das erste Nullzeichen nicht enthält.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
Das Array muss Unicode-Zeichen enthalten. In C++ bedeutet dies, dass das Zeichenarray entweder als verwalteter Char[] Typ oder nicht verwalteter
wchar_t
[] Typ definiert werden muss.Wenn die String(Char*) Überladung aufgerufen wird und das Array nicht null beendet wird, oder wenn die String(Char*, Int32, Int32) Überladung aufgerufen wird und
startIndex
+length
-1 einen Bereich enthält, der außerhalb des für die Abfolge von Zeichen zugewiesenen Speichers liegt, ist das Verhalten des Konstruktors systemabhängig, und eine Zugriffsverletzung kann auftreten.Von einem Zeiger auf ein signiertes Bytearray. Entweder das gesamte Array oder ein angegebener Bereich kann zum Initialisieren der Zeichenfolge verwendet werden. Die Bytesequenz kann mithilfe der Standardcodeseitencodierung interpretiert werden, oder eine Codierung kann im Konstruktoraufruf angegeben werden. Wenn der Konstruktor versucht, eine Zeichenfolge aus einem gesamten Array zu instanziieren, das nicht null beendet ist, oder wenn der Bereich des Arrays von
value
+startIndex
- +value
+startIndex
length
1 außerhalb des für das Array zugewiesenen Speichers liegt, ist das Verhalten dieses Konstruktors systemabhängig, und es kann zu einer Zugriffsverletzung kommen.Die drei Konstruktoren, die ein signiertes Bytearray als Parameter enthalten, sind in erster Linie für die Konvertierung eines C++
char
-Arrays in eine Zeichenfolge konzipiert, wie in diesem Beispiel gezeigt: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
Wenn das Array Nullzeichen ('\0') oder Byte enthält, deren Wert 0 ist und die String(SByte*, Int32, Int32) Überladung aufgerufen wird, enthält
length
die Zeichenfolgeninstanz Zeichen einschließlich eingebetteter Nullen. Das folgende Beispiel zeigt, was passiert, wenn ein Zeiger auf ein Array von 10 Elementen mit zwei NULL-Zeichen an die String(SByte*, Int32, Int32) Methode übergeben wird. Da die Adresse der Anfang des Arrays ist und alle Elemente im Array der Zeichenfolge hinzugefügt werden sollen, instanziiert der Konstruktor eine Zeichenfolge mit zehn Zeichen, einschließlich zwei eingebetteter Nullen. Wenn dasselbe Array hingegen an den Konstruktor übergeben wird, handelt es sich bei dem String(SByte*) Ergebnis um eine vierstellige Zeichenfolge, die das erste Nullzeichen nicht enthält.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
Da die String(SByte*) String(SByte*, Int32, Int32) Konstruktoren mithilfe der STANDARDMÄßIGen ANSI-Codeseite interpretiert werden
value
, können beim Aufrufen dieser Konstruktoren mit identischen Bytearrays Zeichenfolgen mit unterschiedlichen Werten auf verschiedenen Systemen erstellt werden.
Behandeln von sich wiederholenden Zeichenfolgen
Apps, die Textströme analysieren oder decodieren, verwenden häufig den String(Char[], Int32, Int32) Konstruktor oder die StringBuilder.Append(Char[], Int32, Int32) Methode, um Zeichenabfolgen in eine Zeichenfolge zu konvertieren. Beim wiederholten Erstellen neuer Zeichenfolgen mit demselben Wert wird Speicher verschwendet, anstatt eine Zeichenfolge zu erstellen und wiederzuverwenden. Wenn Sie wahrscheinlich denselben Zeichenfolgenwert wiederholt erstellen, indem Sie den String(Char[], Int32, Int32) Konstruktor aufrufen, auch wenn Sie im Voraus nicht wissen, was diese identischen Zeichenfolgenwerte sein können, können Sie stattdessen eine Nachschlagetabelle verwenden.
Angenommen, Sie lesen und analysieren einen Datenstrom von Zeichen aus einer Datei, die XML-Tags und Attribute enthält. Wenn Sie den Datenstrom analysieren, werden wiederholt bestimmte Token (d. h. Abfolgen von Zeichen, die eine symbolische Bedeutung haben) gefunden. Token, die den Zeichenfolgen "0", "1", "true" und "false" entsprechen, treten wahrscheinlich häufig in einem XML-Datenstrom auf.
Anstatt jedes Token in eine neue Zeichenfolge zu konvertieren, können Sie ein System.Xml.NameTable Objekt erstellen, das häufig vorkommende Zeichenfolgen enthält. Das NameTable Objekt verbessert die Leistung, da es gespeicherte Zeichenfolgen abruft, ohne temporären Speicher zu zuordnen. Wenn Sie auf ein Token stoßen, verwenden Sie die NameTable.Get(Char[], Int32, Int32) Methode, um das Token aus der Tabelle abzurufen. Wenn das Token vorhanden ist, gibt die Methode die entsprechende Zeichenfolge zurück. Wenn das Token nicht vorhanden ist, verwenden Sie die NameTable.Add(Char[], Int32, Int32) Methode, um das Token in die Tabelle einzufügen und die entsprechende Zeichenfolge abzurufen.
Beispiel 1: Verwenden der Zeichenfolgenzuweisung
Im folgenden Beispiel wird eine neue Zeichenfolge erstellt, indem sie ihm ein Zeichenfolgenliteral zuweist. Sie erstellt eine zweite Zeichenfolge, indem Sie ihm den Wert der ersten Zeichenfolge zuweisen. Dies sind die beiden am häufigsten verwendeten Methoden zum Instanziieren eines neuen String Objekts.
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.
Beispiel 2: Verwenden eines Zeichenarrays
Im folgenden Beispiel wird veranschaulicht, wie ein neues String Objekt aus einem Zeichenarray erstellt wird.
// 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)))
Beispiel 3: Verwenden eines Teils eines Zeichenarrays und Wiederholen eines einzelnen Zeichens
Im folgenden Beispiel wird das Erstellen eines neuen String Objekts aus einem Teil eines Zeichenarrays und das Erstellen eines neuen String Objekts veranschaulicht, das mehrere Vorkommen eines einzelnen Zeichens enthält.
// 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)
Beispiel 4: Verwenden eines Zeigers auf ein Zeichenarray
Im folgenden Beispiel wird veranschaulicht, wie ein neues String Objekt von einem Zeiger auf ein Array von Zeichen erstellt wird. Das C#-Beispiel muss mithilfe des /unsafe
Compilerschalters kompiliert werden.
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!
Beispiel 5: Instanziieren einer Zeichenfolge von einem Zeiger und einem Bereich eines Arrays
Im folgenden Beispiel werden die Elemente eines Zeichenarrays für einen Punkt oder ein Ausrufezeichen untersucht. Wenn eine gefunden wird, instanziiert sie eine Zeichenfolge aus den Zeichen im Array, die vor dem Interpunktionssymbol stehen. Wenn nicht, instanziiert sie eine Zeichenfolge mit dem gesamten Inhalt des Arrays. Das C#-Beispiel muss mit dem /unsafe
Compilerschalter kompiliert werden.
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
Beispiel 6: Instanziieren einer Zeichenfolge von einem Zeiger auf ein signiertes Bytearray
Im folgenden Beispiel wird veranschaulicht, wie Sie eine Instanz der String Klasse mit dem String(SByte*) Konstruktor erstellen können.
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}"