2016-02-16 1 views
19

FormattableString arasındaki fark C# 6.0 ile tanıtıldı. string nesnesini kullanarak aynı dize biçimlendirmesini kullanabileceğimiz gibi neden FormattableString veya IFormattable'u kullanmamız gerekiyor. Üç arasındaki fark nedir? Her şeydenDize, BiçimlendirilebilirString, IFormattable

Benim Kod

 var name = "Pravin"; 
     var s = $"Hello, {name}"; 
     System.IFormattable s1 = $"Hello, {name}"; 
     System.FormattableString s2 = $"Hello, {name}"; 

aynı sonucu var üretir. Birisi aynı derin bilgiye sahipse, daha ayrıntılı bir yanıt alabilir miyim?

cevap

28

FormattableString, .NET 4.6'da yeni bir türdür ve derleyici, yalnızca değerini kullanmak için'u kullanırsa kullanır. Başka bir deyişle, enterpolasyonlu bir dizgi değişkeni türü normal olarak string - string.Format ile oluşturulmuştur - ancak bunu isterseniz FormattableString (FormattableStringFactory aracılığıyla) olabilir. Bir FormattableString, string.Format'a (ör. "Hello, {0}") geçirilecek biçim dizgisinden ve biçimlendirmek için geçirilecek argümanlardan oluşur. Önemli olarak, bu bilgiler biçimlendirmeden önce yakalanır.

Bu, biçimlendirmeyi uygun şekilde ayarlamanıza olanak sağlar - çoğunlukla, genellikle Invariant static method ile değişmeyen kültürde gerçekleştirmesi için.

IFormattable değişkenine enterpolasyonlu bir dizgi hazırladığınızda, bu da FormattableString'u kullanır. IFormattable.ToString(string, CultureInfo) implementation, bu durumda ilk argümanı yok sayar, bu da muhtemelen açık arabirim uygulamasını neden kullanır.

örnek kod:

using System; 
using System.Globalization; 
using System.Threading; 
using static System.FormattableString; 

class Test 
{ 
    static void Main() 
    { 
     var uk = CultureInfo.CreateSpecificCulture("en-GB"); 
     Thread.CurrentThread.CurrentCulture = uk; 
     var germany = CultureInfo.CreateSpecificCulture("de-DE"); 
     string now = $"Default: it is now {DateTime.UtcNow}"; 
     Console.WriteLine(now); // UK format 
     IFormattable x = $"Specific: It is now {DateTime.UtcNow}"; 
     Console.WriteLine(x.ToString("ignored", germany)); 
     FormattableString y = $"FormattableString: It is now {DateTime.UtcNow}"; 
     Console.WriteLine(FormattableString.Invariant(y)); 
     // Via using static 
     Console.WriteLine(Invariant($"It is now {DateTime.UtcNow}")); 
    } 
} 

örnek sonuçlar: o @JonSkeet için

Default: it is now 16/02/2016 07:16:21 
Specific: It is now 16.02.2016 07:16:21 
FormattableString: It is now 02/16/2016 07:16:21 
It is now 02/16/2016 07:16:21 
+0

teşekkürler! –

+1

'string'' IFormattable' ı uygulayamadığından, 'biçimlendirilebilirString' işlevini kullanarak enterpolasyonlu dizeyi' IFormattable''a çevirdiğinizde yalnızca bir seçim yapılır. – PetSerAl

+0

@PetSerAI: Kesinlikle haklısınız. Ne düşündüğümden emin değilim. Düzenleyecek Ofise gittiğimde ... –