2015-07-11 22 views
8

Kısa ve basit. C# 6.0'daki yeni dize enterpolasyonu yansıma güveniyor mu? YaniC# 6.0'ın String enterpolasyonu Yansıma'ya dayanıyor mu?

string myStr = $"Hi {name}, how are you?"; 

"name" değişkenini ve değerini bulmak için çalışma zamanında yansımayı kullanın?

+5

Neden gerekli? Derleyici ihtiyaç duyduğu tüm bilgilere sahiptir. Eğer 'name' değişken ismi kapsamdaysa, kullanılacaktır, aksi takdirde bir hata olacaktır. –

+1

Bilmiyorum, bu yüzden sordum. Biçim dizgisinin ikilide "olduğu gibi" kaydedilip kaydedilmediğinden emin değildim ve boşlukları (klasik durumda {0} vb. Değişkenler ile) doldurur. Durum böyle olsaydı, o zaman yansıma kullanmalıydı, ama bu ifadelerin derleyici – Xaser

+1

tarafından nasıl işlendiğini bilmiyorum ama ne olup bittiğini görmek için dotPeek gibi bir decompiler izleyeceğim –

cevap

18

Hayır. Tamamen derleme zamanı değerlendirmesine dayanır.

Sen derler ve bu decompiles bu TryRoslyn example ile görebilirsiniz: Bu içine

int name = 4; 
string myStr = $"Hi {name}, how are you?"; 

:

int num = 4; 
string.Format("Hi {0}, how are you?", num); 

dize enterpolasyon da böylece sonuç olarak IFormattable kullanarak destekler (again using TryRoslyn) Bu:

int name = 4; 
IFormattable myStr = $"Hi {name}, how are you?"; 

bu işe açar:

int num = 4; 
FormattableStringFactory.Create("Hi {0}, how are you?", new object[] { num }); 
+1

Teşekkürler! String.Format'a tamamen eşdeğer olup olmadığını sormak üzereydim ama bu TryRoslyn Örneği her şeyi daha net hale getirdi :) en kısa zamanda kabul edecek. – Xaser

+0

@ i3arnon, "Merhaba" {0}, nasılsınız? ";' '' String.Format' için argüman olarak '0' derledim ve yazdım. Derleyici neden kodu koyabildiğini açıkça belli ediyor: "$" Merhaba {friend.GiveMeYourName()}, nasılsınız? ";' '. Ancak sayı koyma yeteneğinin ardındaki mantık çok ilginç. –

+1

@LeonidVasilyev neden? Bu sadece bir ifade. Derleyici neden farklı davranmalı? Yazmak için ilginç bir kod satırı olurdu, ancak derleyici bunu yazmanıza izin vermeli. – i3arnon

3

This article o dayalı derleme-zamanı (ve içten string.Format() çağırır olduğunu açıklar. Alıntı:

Dize enterpolasyonu, eşdeğer bir dizeyi çağırmak için derleme zamanında dönüştürülür.Örnek çağrısı. Bu, daha önce olduğu gibi yerelleştirme için destek sağlar (yine de bileşik biçim dizeleriyle birlikte olsa da) ve kodlar aracılığıyla kod derlemesini herhangi bir derleme yapmaz.