NET'te yeni dizeler oluşturma

.NET, dizelerin basit atama kullanılarak oluşturulmasına olanak tanır ve ayrıca bir dizi farklı parametre kullanarak dize oluşturmayı desteklemek için bir sınıf oluşturucusunu aşırı yükler. .NET ayrıca sınıfta birkaç dizeyi, dize dizisini veya nesneyi birleştirerek yeni dize nesneleri oluşturan çeşitli yöntemler System.String sağlar.

Atamayı kullanarak dizeler oluşturma

Yeni String bir nesne oluşturmanın en kolay yolu, bir String nesneye bir dize değişmezi atamaktır.

Bir sınıf yapıcısı kullanarak dizeler oluşturun

Karakter dizilerinden string oluşturmak için String sınıf yapıcısının aşırı yüklemelerini kullanabilirsiniz. Belirli bir karakteri belirtilen sayıda çoğaltarak da yeni bir dize oluşturabilirsiniz. String(ReadOnlySpan<Char>) Oluşturucu aşırı yüklemesi, karakterlerden oluşan bir ReadOnlySpan<T> veya yığından tahsis edilen bir Span<T> kabul eder ve bilinen boyutta küçük dizeler oluşturduğunuzda yönetilen yığında ara bir karakter dizisi tahsis etmekten kaçınır. Ancak, sonuçta elde edilen dize örneği yine de yönetilen yığında tahsis edilir.

String döndüren yöntemler

Aşağıdaki tabloda, yeni dize nesneleri döndüren birkaç kullanışlı yöntem listelenmektedir.

Yöntem adı Kullan
String.Format Bir dizi giriş nesnesinden biçimlendirilmiş bir dize oluşturur.
String.Concat İki veya daha fazla dizeden dizeler oluşturur.
String.Join Bir dize dizisini birleştirerek yeni bir dize oluşturur.
String.Insert Varolan bir dizenin belirtilen dizinine bir dize ekleyerek yeni bir dize oluşturur.
String.CopyTo Bir dizedeki belirtilen karakterleri, bir karakter dizisinde belirtilen konuma kopyalar.
String.Create Belirtilen uzunlukta yeni bir dize oluşturur ve bu dizeyi, yazılabilir Span<T> ve çağıran tarafından sağlanan bir durum nesnesi alan bir geri çağırma aracılığıyla karakterlerle doldurur.

String.Format

Biçimlendirilmiş dizeler oluşturmak ve birden çok nesneyi temsil eden dizeleri birleştirmek için bu yöntemi kullanabilirsiniz String.Format . Bu yöntem, geçirilen herhangi bir nesneyi otomatik olarak bir dizeye dönüştürür. Örneğin, uygulamanızın kullanıcıya bir Int32 değer ve bir DateTime değer göstermesi gerekiyorsa, yöntemini kullanarak Format bu değerleri temsil etmek için kolayca bir dize oluşturabilirsiniz. Bu yöntemle kullanılan biçimlendirme kuralları hakkında daha fazla bilgi için, bileşik biçimlendirme ile ilgili bölüme bakın.

Aşağıdaki örnek, tamsayı değişkeni Format kullanan bir dize oluşturmak için yöntemini kullanır.

int numberOfFleas = 12;
string miscInfo = String.Format("Your dog has {0} fleas. " +
                                "It is time to get a flea collar. " +
                                "The current universal date is: {1:u}.",
                                numberOfFleas, DateTime.Now);
Console.WriteLine(miscInfo);
// The example displays the following output:
//       Your dog has 12 fleas. It is time to get a flea collar.
//       The current universal date is: 2008-03-28 13:31:40Z.
Dim numberOfFleas As Integer = 12
Dim miscInfo As String = String.Format("Your dog has {0} fleas. " & _
                                       "It is time to get a flea collar. " & _
                                       "The current universal date is: {1:u}.", _
                                       numberOfFleas, Date.Now)
Console.WriteLine(miscInfo)
' The example displays the following output:
'       Your dog has 12 fleas. It is time to get a flea collar. 
'       The current universal date is: 2008-03-28 13:31:40Z.

Bu örnekte, DateTime.Now geçerli tarih ve saati, geçerli iş parçacığıyla ilişkili kültüre göre belirtilen bir şekilde görüntüler.

String.Concat

Yöntem String.Concat , iki veya daha fazla mevcut nesneden kolayca yeni bir dize nesnesi oluşturmak için kullanılabilir. Dizeleri birleştirmek için dilden bağımsız bir yol sağlar. Bu yöntem, 'den System.Objecttüretilen herhangi bir sınıfı kabul eder. Aşağıdaki örnek, varolan iki dize nesnesinden ve bir ayırıcı karakterden bir dize oluşturur.

string helloString1 = "Hello";
string helloString2 = "World!";
Console.WriteLine(String.Concat(helloString1, ' ', helloString2));
// The example displays the following output:
//      Hello World!
Dim helloString1 As String = "Hello"
Dim helloString2 As String = "World!"
Console.WriteLine(String.Concat(helloString1, " "c, helloString2))
' The example displays the following output:
'      Hello World!

String.Join

yöntemi String.Join , bir dize dizisinden ve bir ayırıcı dizeden yeni bir dize oluşturur. Bu yöntem, birden çok dizeyi birleştirmek ve belki de virgülle ayrılmış bir liste oluşturmak istiyorsanız kullanışlıdır.

Aşağıdaki örnek, bir dize dizisini bağlamak için bir boşluk kullanır.

string[] words = {"Hello", "and", "welcome", "to", "my" , "world!"};
Console.WriteLine(String.Join(" ", words));
// The example displays the following output:
//      Hello and welcome to my world!
Dim words() As String = {"Hello", "and", "welcome", "to", "my", "world!"}
Console.WriteLine(String.Join(" ", words))
' The example displays the following output:
'      Hello and welcome to my world!

String.Insert

yöntemi String.Insert , bir dizeyi başka bir dizede belirtilen bir konuma ekleyerek yeni bir dize oluşturur. Bu yöntem sıfır tabanlı bir dizin kullanır. Aşağıdaki örnek, 'nin MyString beşinci dizin konumuna bir dize ekler ve bu değerle yeni bir dize oluşturur.

string sentence = "Once a time.";
 Console.WriteLine(sentence.Insert(4, " upon"));
 // The example displays the following output:
 //      Once upon a time.
Dim sentence As String = "Once a time."
Console.WriteLine(sentence.Insert(4, " upon"))
' The example displays the following output:
'      Once upon a time.

String.CopyTo

yöntemi String.CopyTo , bir dizenin bölümlerini bir karakter dizisine kopyalar. Hem dizenin başlangıç dizinini hem de kopyalanacak karakter sayısını belirtebilirsiniz. Bu yöntem kaynak dizini, bir karakter dizisini, hedef dizini ve kopyalanacak karakter sayısını alır. Tüm indeksler sıfır tabanlıdır.

Aşağıdaki örnek, "Hello" sözcüğünün CopyTo karakterlerini bir dize nesnesinden bir karakter dizisinin ilk dizin konumuna kopyalamak için kullanılan yöntemi kullanır.

string greeting = "Hello World!";
char[] charArray = {'W','h','e','r','e'};
Console.WriteLine($"The original character array: {new string(charArray)}");
greeting.CopyTo(0, charArray,0 ,5);
Console.WriteLine($"The new character array: {new string(charArray)}");
// The example displays the following output:
//       The original character array: Where
//       The new character array: Hello
Dim greeting As String = "Hello World!"
Dim charArray() As Char = {"W"c, "h"c, "e"c, "r"c, "e"c}
Console.WriteLine("The original character array: {0}", New String(charArray))
greeting.CopyTo(0, charArray, 0, 5)
Console.WriteLine("The new character array: {0}", New String(charArray))
' The example displays the following output:
'       The original character array: Where
'       The new character array: Hello

String.Create

String.Create yöntemi, yeni bir dizenin karakterlerini bir geri çağırma kullanarak programatik olarak doldurmanızı sağlar. Geri çağırma, ara karakter arabellekleri ayırmadan dizenin içeriğini oluşturabilmeniz için yazılabilir bir karakter dizisi Span<T> ve çağırıcı tarafından sağlanan durum nesnesini alır. Geri çağırmanın kendisi, örneğin yerel değişkenleri yakalarsa veya diğer ayırma ağır API'leri çağırırsa yine de ayırabilir.

Aşağıdaki örnekte ardışık alfabe karakterlerinden beş karakterlik bir dize oluşturmak için kullanılır String.Create :

string result = string.Create(5, 'a', (span, firstChar) =>
{
    for (int i = 0; i < span.Length; i++)
    {
        span[i] = (char)(firstChar + i);
    }
});

Console.WriteLine(result); // abcde
Module Program
    Sub Main()
        Dim result As String = String.Create(5, "a"c, Sub(span, firstChar)
                                                           For i As Integer = 0 To span.Length - 1
                                                               span(i) = ChrW(AscW(firstChar) + i)
                                                           Next
                                                       End Sub)

        Console.WriteLine(result) ' abcde
    End Sub
End Module

String.Create , son dize uzunluğunu önceden bildiğiniz ve ara karakter arabelleklerini ayırmaktan kaçınmak istediğiniz performansa duyarlı senaryolar için tasarlanmıştır. Çalışma zamanı yeni bir dize ayırır, geri çağırma arabelleğine doğrudan olarak Span<char>geçirir ve geri çağırma döndürdüğünde sabit dizeyi döndürür. Geri çağırma tamamlandıktan sonra veri kopyası gerçekleşmez.

String.Create ile new String(Span<char>) karşılaştırması

Dizeleri verimli bir şekilde oluşturmanın bir diğer seçeneği, stackalloc ile bir karakter arabelleği ayırmak, bunu doldurmak ve String(ReadOnlySpan<char>) oluşturucusuna geçirmektir.

static string CreateStringFromSpan()
{
    Span<char> span = stackalloc char[5];
    for (int i = 0; i < 5; i++)
    {
        span[i] = (char)('a' + i);
    }
    return new string(span);
}

Console.WriteLine(CreateStringFromSpan()); // abcde

Her iki yaklaşım da son dizeyi tam olarak bir kez tahsis eder. Önemli farklar şunlardır:

  • stackalloc + new string(span) çalışma arabelleğini yığına yerleştirir. Bu küçük, sabit boyutlu arabellekler için en hızlıdır, ancak yığın sonlu bir kaynaktır; büyük veya derin iç içe ayırmalar bir StackOverflowException neden olabilir. Bu örnekte C# stackalloc deseni gösterilmektedir; Visual Basic stackalloc desteklemez, ancak yine de bir String(ReadOnlySpan<char>) öğesine sahip olduğunuzda ReadOnlySpan<char> oluşturucusunu çağırabilir.
  • String.Create yığın üzerindeki çalışma arabelleği dize nesnesinin bir parçası olarak ayırır, bu nedenle yığın baskısı olmaz. Çalışma zamanı, bir başvuru türü veya yakalanmamış bir yapı olduğunda kutulama ayırmalarından kaçınarak, kutulama olmaksızın geri çağırma fonksiyonunuza ilettiği, türü açıkça belirtilmiş bir durum parametresini de kabul eder. Genel olarak, bilinen, sınırlanmış boyuta sahip küçük dizeleri (genellikle birkaç yüz karakterden daha az) tercih stackalloc + new String(span) edin. Büyük olabileceği durumlarda, yığın baskısından kaçınmak istediğinizde ya da durumu kutulamadan geri çağrıya geçirirken String.Create kullanın.

Ayrıca bkz.