Construtor System.String
Este artigo fornece observações complementares à documentação de referência para essa API.
Sintaxe de construtor sobrecarregada
Os construtores de cadeia de caracteres se enquadram em duas categorias: aqueles sem parâmetros de ponteiro e aqueles com parâmetros de ponteiro. Os construtores que usam ponteiros não são compatíveis com CLS. Além disso, o Visual Basic não dá suporte ao uso de ponteiros e o C# requer que o código que usa ponteiros seja executado em um contexto não seguro. Para obter mais informações, consulte unsafe.
Para obter diretrizes adicionais sobre como escolher uma sobrecarga, consulte Qual método devo chamar?.
String(Char[] value)
Inicializa a nova instância com o valor indicado por uma matriz de caracteres Unicode. Esse construtor copia caracteres Unicode (Exemplo 2: Usar uma matriz de caracteres).
String(Char[] value, Int32 startIndex, Int32 length)
Inicializa a nova instância para o valor indicado por uma matriz de caracteres Unicode, uma posição de caractere inicial dentro dessa matriz e um comprimento (Exemplo 3: usar uma parte de uma matriz de caracteres e repetir um único caractere).
String(Char c, Int32 count)
Inicializa a nova instância com o valor indicado por um caractere Unicode especificado repetido um número especificado de vezes (Exemplo 3: Usar uma parte de uma matriz de caracteres e repetir um único caractere).
String(char* value)
(Não compatível com CLS) Inicializa a nova instância com o valor indicado por um ponteiro para uma matriz de caracteres Unicode que é encerrada por um caractere nulo (U+0000 ou '\0'). (Exemplo 4: Usar um ponteiro para uma matriz de caracteres).
Permissão: SecurityCriticalAttribute, requer confiança total para o chamador imediato. Este membro não pode ser usado pelo código transparente ou parcialmente confiável.
String(char* value, Int32 startIndex, Int32 length)
(Não compatível com CLS) Inicializa a nova instância com o valor indicado por um ponteiro para uma matriz de caracteres Unicode, uma posição de caractere inicial dentro dessa matriz e um comprimento. O construtor copia os caracteres Unicode do value
início no índice startIndex
e do término no índice startIndex
length
+ - 1 (Exemplo 5: instanciar uma cadeia de caracteres de um ponteiro e um intervalo de uma matriz).
Permissão: SecurityCriticalAttribute, requer confiança total para o chamador imediato. Este membro não pode ser usado pelo código transparente ou parcialmente confiável.
String(SByte* value)
(Não compatível com CLS) Inicializa a nova instância para o valor indicado por um ponteiro para uma matriz de inteiros assinados de 8 bits. Supõe-se que a matriz represente uma cadeia de caracteres codificada usando a página de código do sistema atual (ou seja, a codificação especificada por Encoding.Default). O construtor processa caracteres desde value
o início do local especificado pelo ponteiro até que um caractere nulo (0x00) seja alcançado (Exemplo 6: instanciar uma cadeia de caracteres de um ponteiro para uma matriz de bytes assinada).
Permissão: SecurityCriticalAttribute, requer confiança total para o chamador imediato. Este membro não pode ser usado pelo código transparente ou parcialmente confiável.
String(SByte* value, Int32 startIndex, Int32 length)
(Não compatível com CLS) Inicializa a nova instância para o valor indicado por um ponteiro para uma matriz de inteiros com sinal de 8 bits, uma posição inicial dentro dessa matriz e um comprimento. Supõe-se que a matriz represente uma cadeia de caracteres codificada usando a página de código do sistema atual (ou seja, a codificação especificada por Encoding.Default). O construtor processa caracteres do valor começando em startIndex
e terminando em startIndex
length
+ - 1 (Exemplo 6: instanciar uma cadeia de caracteres de um ponteiro para uma matriz de bytes assinada).
Permissão: SecurityCriticalAttribute, requer confiança total para o chamador imediato. Este membro não pode ser usado pelo código transparente ou parcialmente confiável.
String(SByte* value, Int32 startIndex, Int32 length, Encoding enc)
(Não compatível com CLS) Inicializa a nova instância para o valor indicado por um ponteiro para uma matriz de inteiros com sinal de 8 bits, uma posição inicial dentro dessa matriz, um comprimento e um Encoding objeto.
Permissão: SecurityCriticalAttribute, requer confiança total para o chamador imediato. Este membro não pode ser usado pelo código transparente ou parcialmente confiável.
Parâmetros
Aqui está uma lista completa de parâmetros usados por String construtores que não incluem um parâmetro de ponteiro. Para os parâmetros usados por cada sobrecarga, consulte a sintaxe de sobrecarga acima.
Parâmetro | Tipo | Descrição |
---|---|---|
value |
Char[] | Uma matriz de caracteres Unicode. |
c |
Char | Um caractere Unicode. |
startIndex |
Int32 | A posição inicial em value do primeiro caractere na nova cadeia de caracteres.Valor padrão: 0 |
length |
Int32 | O número de caracteres a value serem incluídos na nova cadeia de caracteres.Valor padrão: Array.Length |
count |
Int32 | O número de vezes que o caractere c é repetido na nova cadeia de caracteres. Se count for zero, o valor do novo objeto será String.Empty. |
Aqui está uma lista completa de parâmetros usados por String construtores que incluem um parâmetro de ponteiro. Para os parâmetros usados por cada sobrecarga, consulte a sintaxe de sobrecarga acima.
Parâmetro | Tipo | Descrição |
---|---|---|
value |
Char* -ou- SByte* |
Um ponteiro para uma matriz terminada em nulo de caracteres Unicode ou uma matriz de inteiros assinados de 8 bits. Se value for null ou uma matriz vazia, o valor da nova string será String.Empty. |
startIndex |
Int32 | O índice do elemento de matriz que define o primeiro caractere na nova cadeia de caracteres. Valor padrão: 0 |
length |
Int32 | O número de elementos de matriz a serem usados para criar a nova cadeia de caracteres. Se length for zero, o construtor criará uma string cujo valor é String.Empty. Valor padrão: Array.Length |
enc |
Encoding | Um objeto que especifica como a value matriz é codificada.Valor padrão: Encoding.Default, ou a página de código ANSI atual do sistema |
Exceções
Aqui está uma lista de exceções geradas por construtores que não incluem parâmetros de ponteiro.
Exceção | Condição | Lançado por |
---|---|---|
ArgumentNullException | value é null . |
String(Char[], Int32, Int32) |
ArgumentOutOfRangeException | startIndex , length ou count é menor que zero.-ou- A soma de startIndex e length é maior que o número de elementos em value .-ou- count é menor que zero. |
String(Char, Int32) String(Char[], Int32, Int32) |
Aqui está uma lista de exceções geradas por construtores que incluem parâmetros de ponteiro.
Exceção | Condição | Lançado por |
---|---|---|
ArgumentException | value especifica uma matriz que contém um caractere Unicode inválido.-ou- value ou value + startIndex especifica um endereço inferior a 64K.-ou- Uma nova String instância não pôde ser inicializada a value partir da matriz de bytes porque value não usa a codificação de página de código padrão. |
Todos os construtores com ponteiros. |
ArgumentNullException | value é nulo. |
String(SByte*) String(SByte*, Int32, Int32) String(SByte*, Int32, Int32, Encoding) |
ArgumentOutOfRangeException | O processo atual não tem acesso de leitura a todos os caracteres endereçados. -ou- startIndex ou length é menor que zero, value + startIndex causa um estouro do ponteiro ou o processo atual não tem acesso de leitura a todos os caracteres endereçados.-ou- O comprimento da nova cadeia de caracteres é muito grande para ser alocado. |
Todos os construtores com ponteiros. |
AccessViolationException | value , ou value + + startIndex length - 1, especifica um endereço inválido. |
String(SByte*) String(SByte*, Int32, Int32) String(SByte*, Int32, Int32, Encoding) |
Qual método devo chamar?
Para | Ligar ou usar |
---|---|
Crie uma cadeia de caracteres. | Atribuição de um literal de cadeia de caracteres ou de uma cadeia de caracteres existente (Exemplo 1: usar atribuição de cadeia de caracteres) |
Crie uma cadeia de caracteres a partir de uma matriz de caracteres inteira. | String(Char[]) (Exemplo 2: Usar uma matriz de caracteres) |
Crie uma cadeia de caracteres a partir de uma parte de uma matriz de caracteres. | String(Char[], Int32, Int32) (Exemplo 3: Usar uma parte de uma matriz de caracteres e repetir um único caractere) |
Crie uma cadeia de caracteres que repita o mesmo caractere várias vezes. | String(Char, Int32) (Exemplo 3: Usar uma parte de uma matriz de caracteres e repetir um único caractere) |
Crie uma cadeia de caracteres de um ponteiro para uma matriz de caracteres Unicode ou larga. | String(Char*) |
Crie uma cadeia de caracteres a partir de uma parte de uma matriz de caracteres Unicode ou larga usando seu ponteiro. | String(Char*, Int32, Int32) |
Crie uma cadeia de caracteres a partir de uma matriz C++ char . |
String(SByte*), String(SByte*, Int32, Int32) -ou- String(SByte*, Int32, Int32, Encoding) |
Crie uma cadeia de caracteres a partir de caracteres ASCII. | ASCIIEncoding.GetString |
Criar cadeias de caracteres
A técnica mais comumente usada para criar cadeias de caracteres programaticamente é a atribuição simples, conforme ilustrado no Exemplo 1. A String classe também inclui quatro tipos de sobrecargas de construtor que permitem criar cadeias de caracteres a partir dos seguintes valores:
De uma matriz de caracteres (uma matriz de caracteres codificados em UTF-16). Você pode criar um novo String objeto a partir dos caracteres em toda a matriz ou em uma parte dela. O String(Char[]) construtor copia todos os caracteres da matriz para a nova cadeia de caracteres. O String(Char[], Int32, Int32) construtor copia os caracteres de índice
startIndex
para índicestartIndex
+length
- 1 para a nova cadeia de caracteres. Selength
for zero, o valor da nova cadeia de caracteres será String.Empty.Se o código instanciar repetidamente cadeias de caracteres com o mesmo valor, você poderá melhorar o desempenho do aplicativo usando um meio alternativo de criar cadeias de caracteres. Para obter mais informações, consulte Manipular cadeias de caracteres repetitivas.
De um único caractere que é duplicado zero, uma ou mais vezes, usando o String(Char, Int32) construtor. Se
count
for zero, o valor da nova cadeia de caracteres será String.Empty.De um ponteiro para uma matriz de caracteres terminada em nulo, usando o String(Char*) construtor or String(Char*, Int32, Int32) . A matriz inteira ou um intervalo especificado pode ser usado para inicializar a cadeia de caracteres. O construtor copia uma sequência de caracteres Unicode começando do ponteiro especificado ou do ponteiro especificado mais
startIndex
e continuando até o final da matriz ou paralength
caracteres. Sevalue
for um ponteiro nulo oulength
for zero, o construtor criará uma cadeia de caracteres cujo valor é String.Empty. Se a operação de cópia prosseguir até o final da matriz e a matriz não for terminada em nulo, o comportamento do construtor será dependente do sistema. Essa condição pode causar uma violação de acesso.Se a matriz contiver caracteres nulos inseridos (U+0000 ou '\0') e a String(Char*, Int32, Int32) sobrecarga for chamada, a instância da cadeia de caracteres conterá
length
caracteres, incluindo nulos inseridos. O exemplo a seguir mostra o que acontece quando um ponteiro para uma matriz de 10 elementos que inclui dois caracteres nulos é passado para o String(Char*, Int32, Int32) método. Como o endereço é o início da matriz e todos os elementos da matriz devem ser adicionados à cadeia de caracteres, o construtor instancia uma cadeia de caracteres com dez caracteres, incluindo dois nulos inseridos. Por outro lado, se a mesma matriz for passada para o String(Char*) construtor, o resultado será uma cadeia de caracteres de quatro caracteres que não inclui o primeiro caractere nulo.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
A matriz deve conter caracteres Unicode. Em C++, isso significa que a matriz de caracteres deve ser definida como o tipo gerenciado Char[] ou o tipo não gerenciado
wchar_t
[].Se a String(Char*) sobrecarga for chamada e a matriz não for terminada em nulo, ou se a String(Char*, Int32, Int32) sobrecarga for chamada e
startIndex
+length
-1 incluir um intervalo que está fora da memória alocada para a sequência de caracteres, o comportamento do construtor será dependente do sistema e poderá ocorrer uma violação de acesso.De um ponteiro para uma matriz de bytes assinada. A matriz inteira ou um intervalo especificado pode ser usado para inicializar a cadeia de caracteres. A sequência de bytes pode ser interpretada usando a codificação de página de código padrão ou uma codificação pode ser especificada na chamada do construtor. Se o construtor tentar instanciar uma cadeia de caracteres de uma matriz inteira que não seja terminada em nulo ou se o intervalo da matriz de
value
+startIndex
avalue
+ +startIndex
length
-1 estiver fora da memória alocada para a matriz, o comportamento desse construtor será dependente do sistema e poderá ocorrer uma violação de acesso.Os três construtores que incluem uma matriz de bytes assinada como um parâmetro são projetados principalmente para converter uma matriz C++
char
em uma cadeia de caracteres, conforme mostrado neste exemplo: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
Se a matriz contiver caracteres nulos ('\0') ou bytes cujo valor é 0 e a String(SByte*, Int32, Int32) sobrecarga for chamada, a instância de cadeia de caracteres conterá
length
caracteres, incluindo nulos inseridos. O exemplo a seguir mostra o que acontece quando um ponteiro para uma matriz de 10 elementos que inclui dois caracteres nulos é passado para o String(SByte*, Int32, Int32) método. Como o endereço é o início da matriz e todos os elementos da matriz devem ser adicionados à cadeia de caracteres, o construtor instancia uma cadeia de caracteres com dez caracteres, incluindo dois nulos inseridos. Por outro lado, se a mesma matriz for passada para o String(SByte*) construtor, o resultado será uma cadeia de caracteres de quatro caracteres que não inclui o primeiro caractere nulo.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
Como os String(SByte*) construtores and String(SByte*, Int32, Int32) interpretam
value
usando a página de código ANSI padrão, chamar esses construtores com matrizes de bytes idênticas pode criar cadeias de caracteres com valores diferentes em sistemas diferentes.
Lidar com cadeias de caracteres repetitivas
Os aplicativos que analisam ou decodificam fluxos de texto geralmente usam o String(Char[], Int32, Int32) construtor ou o StringBuilder.Append(Char[], Int32, Int32) método para converter sequências de caracteres em uma cadeia de caracteres. Criar repetidamente novas cadeias de caracteres com o mesmo valor em vez de criar e reutilizar uma cadeia de caracteres desperdiça memória. Se for provável que você crie o mesmo valor de cadeia de caracteres repetidamente chamando o String(Char[], Int32, Int32) construtor, mesmo que não saiba com antecedência quais podem ser esses valores de cadeia de caracteres idênticos, poderá usar uma tabela de pesquisa.
Por exemplo, suponha que você leia e analise um fluxo de caracteres de um arquivo que contém marcas e atributos XML. Ao analisar o fluxo, você encontra repetidamente determinados tokens (ou seja, sequências de caracteres que têm um significado simbólico). Tokens equivalentes às cadeias de caracteres "0", "1", "true" e "false" provavelmente ocorrerão com frequência em um fluxo XML.
Em vez de converter cada token em uma nova cadeia de caracteres, você pode criar um System.Xml.NameTable objeto para conter cadeias de caracteres comuns. O NameTable objeto melhora o desempenho, pois recupera cadeias de caracteres armazenadas sem alocar memória temporária. Quando você encontrar um token, use o NameTable.Get(Char[], Int32, Int32) método para recuperá-lo da tabela. Se o token existir, o método retornará a cadeia de caracteres correspondente. Se o token não existir, use o NameTable.Add(Char[], Int32, Int32) método para inserir o token na tabela e obter a cadeia de caracteres correspondente.
Exemplo 1: Usar atribuição de cadeia de caracteres
O exemplo a seguir cria uma nova cadeia de caracteres atribuindo-lhe um literal de cadeia de caracteres. Ele cria uma segunda string atribuindo o valor da primeira string a ela. Essas são as duas maneiras mais comuns de instanciar um novo String objeto.
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.
Exemplo 2: Usar uma matriz de caracteres
O exemplo a seguir demonstra como criar um novo String objeto a partir de uma matriz de caracteres.
// 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)))
Exemplo 3: Usar uma parte de uma matriz de caracteres e repetir um único caractere
O exemplo a seguir demonstra como criar um novo String objeto a partir de uma parte de uma matriz de caracteres e como criar um novo String objeto que contém várias ocorrências de um único caractere.
// 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)
Exemplo 4: Usar um ponteiro para uma matriz de caracteres
O exemplo a seguir demonstra como criar um novo String objeto de um ponteiro para uma matriz de caracteres. O exemplo de C# deve ser compilado usando a opção do /unsafe
compilador.
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!
Exemplo 5: instanciar uma cadeia de caracteres de um ponteiro e um intervalo de uma matriz
O exemplo a seguir examina os elementos de uma matriz de caracteres para um ponto ou um ponto de exclamação. Se um for encontrado, ele instancia uma cadeia de caracteres dos caracteres na matriz que precedem o símbolo de pontuação. Caso contrário, ele instancia uma cadeia de caracteres com todo o conteúdo da matriz. O exemplo de C# deve ser compilado usando a opção do /unsafe
compilador.
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
Exemplo 6: instanciar uma cadeia de caracteres de um ponteiro para uma matriz de bytes assinada
O exemplo a seguir demonstra como você pode criar uma instância da String classe com o String(SByte*) construtor.
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}"