2011-08-09 25 views
5

Geçenlerde C#System.string uygulama

string str = "u r awesome"; 
str[0]="i"; 

aşağıdaki yapmaya çalışıyordu Ve görünüşe göre str [i] sadece alamadım bir dizi olduğu için işe yaramaz altında yatan, bu yüzden merak ediyordum Dizenin altında yatan uygulama, str [i] 'yi yalnızca bir getiri olarak zorlayacaktır.

Sadece char * için yönetilen bir sarıcı değil mi? Öyleyse neden str [i] ayarlayamıyorum?

cevap

3

diğerleri immutability ilişkin verdi cevaplar elbette doğru vardır ve sizin sahip konunun "fiili" nedenidir.

Özellikle altta yatan uygulaması hakkında sorular (ve sadece meraktan varsa) ve bu soruya takılmaları olabilir başkaları için bir referans olarak, burada Eric Lippert o konu hakkında biraz daha bilgi olduğundan:

".NET CLR'de, dizeler, OSTR Otomasyonunda BSTR'lerin uygulandığı şekilde hemen hemen aynı biçiminde düzenlenmiştir: kelime hizalanmış bellek arabelleği, uzunluğunu veren dört baytlık bir tam sayıdan oluşur. ve dizenin karakterleri, iki baytlı UTF-16 verisi parçaları izledi, ardından iki sıfır bayt oldu. " "Hemen hemen" kısmı burada, ancak kendilerini bstr

Not ayrıca Eric's blog açıklanmıştır.

Dikkat et, tüm bunlar bir uygulama detayı olarak görülmelidir. Ve çoğumuzun gerçekten endişelenmemesine rağmen, birlikte çalışma sorunları veya genel anlayışta hata ayıklama sırasında yardımcı olabilir.

+0

Bu, özellikle dize nasıl uygulandığına dair, aslında aradığım cevaptı, teşekkürler! – etk1220

8

.NET String sınıfı değişmez olduğu için bir dizenin karakterlerini ayarlayamazsınız; bu, oluşturulduktan sonra içeriğinin değiştirilemeyeceği anlamına gelir. Bu, aynı dize örneğinin, birçok nesne güvenli bir şekilde kullanılmasına izin verir, tek bir nesne, başka bir nesnenin dizeleri üzerinde duracağını düşünmeden.

Karakter dizisini değiştirebilmenizi sağlayan değiştirilebilen bir sınıfa ihtiyacınız varsa, bunun yerine StringBuilder kullanmayı düşünün.

C ile karşılaştırmak isterseniz, String türü const char * türünde olduğu gibi sadece kabızlığı yok edemezsiniz. StringBuilder, içeriğinden yeni, bağımsız bir String örneği oluşturmak için char * (otomatik ayırma yeniden boyutlandırma) ve bir yöntemle (ToString()) daha çok benzer.

cdhowie tarafından cevap gibi
+0

İlgili: StringBuilder iç yapıları http://stackoverflow.com/q/3564906/38206 –

2

, bu c dize kavramına aynı değildir/C++

Böyle aşağıdaki gibi kabın içinden uygulanmasını taklit deneyebilirsiniz bir öneri olarak

Yukarıdaki istiyorsanız,

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

ilgili ayrıntılar Kendine has amacı dizeleri binayı izin vermektir olarak, bunun için 'StringBuilder' kullanmak daha iyi olacaktır. – cdhowie

+1

tamamen katılıyorum. Kod önerisi, gerçekten, eğer gerçekten öğeyi endekse göre manipüle etmek istiyorsa, alternatif bir uygulamada ne kadar etkili olduğunu göstermeye çalışıyor. –

+3

'StringBuilder' sahiptir [bir dizin] (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx) tam olarak bu sağlar. :) – cdhowie

İlgili konular