System.String construtor
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, Visual Basic não oferece suporte ao uso de ponteiros e C# requer código que usa ponteiros para executar em um contexto não seguro. Para obter mais informações, consulte unsafe.
Para obter orientação adicional sobre como escolher uma sobrecarga, consulte Qual método eu chamo?.
String(Char[] value)
Inicializa a nova instância para o valor indicado por uma matriz de caracteres Unicode. Este 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 para 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 para o valor indicado por um ponteiro para uma matriz de caracteres Unicode que é terminada por um caractere nulo (U+0000 ou '\0'). (Exemplo 4: Use 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 para 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 de value
começar no índice e terminar no índice startIndex
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. Presume-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 a partir do value
local especificado pelo ponteiro até que um caractere nulo (0x00) seja atingido (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 assinados de 8 bits, uma posição inicial dentro dessa matriz e um comprimento. Presume-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 e terminando em startIndex
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 assinados 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 no value primeiro caractere na nova cadeia de caracteres.Valor padrão: 0 |
length |
Int32 | O número de caracteres a serem incluídos na nova cadeia de caracteres value .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 cadeia de caracteres 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 cadeia de caracteres cujo valor será 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 lançadas 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 lançadas 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 partir da matriz de bytes porque value não usa a value 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 alocar. |
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 um Unicode ou matriz de caracteres largos. | String(Char*) |
Crie uma cadeia de caracteres a partir de uma parte de uma matriz de caracteres Unicode ou ampla 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:
A partir 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 na matriz para a nova cadeia de caracteres. O String(Char[], Int32, Int32) construtor copia os caracteres de índice para índice
startIndex
startIndex
+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 que têm 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 ou 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. Tal condição pode causar uma violação de acesso.Se a matriz contiver caracteres nulos incorporados (U+0000 ou '\0') e a sobrecarga for chamada, a String(Char*, Int32, Int32) ocorrência de cadeia de caracteres conterá
length
caracteres, incluindo quaisquer nulos incorporados. 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 na matriz devem ser adicionados à cadeia de caracteres, o construtor instancia uma cadeia de caracteres com dez caracteres, incluindo dois nulos incorporados. Por outro lado, se a mesma matriz for passada para o construtor, o resultado será uma cadeia de caracteres de quatro caracteres que não inclui o String(Char*) 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 sobrecarga for chamada e a matriz não for terminada em nulo, ou se a sobrecarga for chamada e -1 incluir um intervalo que está fora da memória alocada para a String(Char*)String(Char*, Int32, Int32) sequência de caracteres, o comportamento do construtor é dependente do sistema e
startIndex
+length
uma violação de acesso pode ocorrer.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 é terminada em nulo, ou se o intervalo da matriz de -
value
length
+ +startIndex
1 estiver fora da memória alocada para a matriz, o comportamento desse construtor é dependente do sistema e uma violação devalue
+startIndex
acesso pode ocorrer.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 for 0 e a sobrecarga for chamada, a String(SByte*, Int32, Int32) ocorrência de cadeia de caracteres conterá
length
caracteres, incluindo quaisquer nulos incorporados. 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 na matriz devem ser adicionados à cadeia de caracteres, o construtor instancia uma cadeia de caracteres com dez caracteres, incluindo dois nulos incorporados. Por outro lado, se a mesma matriz for passada para o construtor, o resultado será uma cadeia de caracteres de quatro caracteres que não inclui o String(SByte*) 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 e 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 que têm valores diferentes em sistemas diferentes.
Manipular cadeias de caracteres repetitivas
Os aplicativos que analisam ou decodificam fluxos de texto geralmente usam o construtor ou o String(Char[], Int32, Int32)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, você pode 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. Quando você analisa o fluxo, você encontra repetidamente certos 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 manter cadeias de caracteres que ocorrem com frequência. O NameTable objeto melhora o desempenho, porque 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 recuperar o token 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 cadeia de caracteres atribuindo o valor da primeira cadeia de caracteres 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 objeto a partir de uma parte de uma matriz de caracteres e como criar um novo StringString 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 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 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}"
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de