2011-05-07 40 views
6

C# içinde ToString() yöntemi hakkında merak ediyorum. Aşağıdaki örnek ele alalım:C# toString() performans

object height = 10; 

string heightStr = height.ToString(); 

Ben height üzerinde ToString() aradığınızda, ben bir dize geri yazın olsun. Çalışma zamanı bu dizge için bellek ayırıyor mu?

+2

ToString() insan içindir, perf olmayan bir konudur. Her neyse olmalı. –

cevap

4

Evet. Bir sınıfın yeni bir örneğini oluşturmak (bu durumda dize sınıfı ile yapıldığı gibi), örnek için bellek ayırır.

+1

Dizelerin değişmez olduğu gerçeğinin burada olduğundan emin değilim. "String" sınıfının varolan bir örneğini değiştirmiyor, daha ziyade "ToString" işlevinin sonucunu "string" olarak yazılan bir değişkene atamak değil. Bu, * değişmez olmasa bile, sınıfın yeni bir örneğini oluşturacaktır. –

+0

@Cody Tüm dize örneklerine yeni bir bellek adresi tahsis edildiğini vurgulamak için bahsettim. Haklısın, onunla çok alakalı değil ama biraz daha fazla netlik getirebileceğini düşündüm. Her durumda, karışıklığı önlemek için değişmezlik sözünü kaldırdım. –

5

Evet, çalışma zamanı, bir yöntem çağrısından döndürülen dahil olmak üzere, oluşturduğunuz veya isteğiniz olan herhangi bir dize nesnesi için bellek ayırır.

Ama hayır, bu kesinlikle endişelenmeniz gereken bir şey değil. Uygulamanızın performansı üzerinde herhangi bir göze çarpan etki olmayacak ve , kodun zamanında optimize edilmesine asla izin vermemelisiniz.

Int32.ToString yöntemi son derece hızlıdır. Herhangi bir uygulama bir performans darboğaz olması muhtemel değildir CLR düzeyinde yazılı yerli kodu aşağı çağırır. Aslında


, burada gerçek performans sorunu tekrar object ve yazmak için bir değer türü dönüştürme işlemi olup boxing, olacak. Bu, height değişkenini tür object olarak bildirdiğiniz ve daha sonra bir tamsayı değeri atandığınız için ortaya çıkar.

O kadar olduğu gibi, tip int olarak açıkça height ilan etme çok daha iyi bir fikirdir: onlar kadar hızlı okumaz çünkü

int height = 10; 
string heightStr = height.ToString(); 
+0

Bir grup boks/kutuklama, bir dizge ayırmaktan daha verimsiz değildir. –

+0

@Matti: Hayır, bir set olmayabilir. Emin olmak için performans verilerini görmek zorundayım, ama burada oldukça alakasız. Yapmaya çalıştığım ayrım, boksun genel olarak kaçınmaya değer bir şey olmasıdır. .NET kodu yazılırken "kötü bir uygulama" olarak kabul edilir ve herkesin bilmesi gereken bir şeydir. Dize tahsisi sorun değil, kaçınılması gereken bir şey de değil. Bir uygulamada performans sorununa neden olmak için tekrarlanan boks/kutulama işlemleri için çok daha büyük bir potansiyel var. –

+0

Küçük bir not olarak: * aynı zamanda ** ** açıkça geçersiz kılmayan bir değer türü değişkeni/ifadesi üzerinde sanal bir yöntem (ToString() gibi) çağırırsanız, kutu * da * oluşur. 'Int' durumunda, orada * bir * açık int.ToString(), ama bu her zaman böyle değil. –