2015-09-02 11 views
14

mogę to zrobić:String interpolacja z formatu zmiennej

var log = string.Format("URL: {0}", url); 

lub nawet jak ten

var format = "URL: {0}"; 
... 
var log = string.Format(format, url); 

mam format zdefiniowane gdzieś indziej i użyć zmiennej format inline, a nie ciąg.

W języku C# 6, to wydaje się niemożliwe:

var format = $"URL: {url}"; // Error url does not exist 
... 
var url = "http://google.com"; 
... 
var log = $format; // The way to evaluate string interpolation here 

Czy mimo użyć interpolacji ciąg ze zmienną zadeklarowane wcześniej?

C# 6 wydaje się interpolować ciąg inline podczas kompilacji. Należy jednak rozważyć skorzystanie z tej funkcji do lokalizacji, zdefiniowanie formatu w konfiguracji lub po prostu posiadanie formatu klasy w klasie const.

+0

Nie możesz tego zrobić. Po prostu użyj 'string.Format'. – SLaks

+0

Musisz użyć "starej metody", której używałeś lub zawinąć w prywatną metodę. –

Odpowiedz

24

Nie, nie można używać interpolacji ciągów za pomocą czegoś innego niż literał łańcuchowy, ponieważ kompilator tworzy "zwykły" ciąg formatu, nawet jeśli używa się interpolacji napisów.

Ponieważ:

string name = "bar"; 
string result = $"{name}"; 

jest kompilowany do tego:

string name = "bar"; 
string result = string.Format("{0}", name); 

ciąg w czasie pracy musi być "normalne" format string a nie ekwiwalent interpolacja ciąg.

Zamiast tego można użyć zwykłego starego String.Format.

+0

Zgodziłem się. Myślałem, że logicznie "{name}" 'to' "{0}" 'odwzorowanie może być wykonane w czasie wykonywania na pierwszym miejscu, ale parametry' string.Format' powinny być kompilowane inline. Nie mogę więc po prostu wprowadzić nowej zmiennej '{name2}' dynamicznie. – CallMeLaNN

+0

, ale przynajmniej powinien zaakceptować 'ciąg stały'. Następnie kompilator może znaleźć token '' {...} "i skonstruować parametry' string.Format'. W każdym razie, nic wielkiego. – CallMeLaNN

+0

@CallMeLaNN to działałoby * tylko * jeśli const została zdefiniowana wewnątrz metody, aby kompilator mógł rozwiązać (i zweryfikować) symbole zastępcze. W przeciwnym razie, w jaki sposób kompilator mógłby zdecydować, czy ciąg stały * na poziomie klasy * był prawidłowy, czy jego placeholder istniały tylko wewnątrz * metod *? –

17

Jednym ze sposobów obejścia, które byłoby użyć lambda zawierający interpolowana ciąg. Coś jak:

Func<string, string> formatter = url => $"URL: {url}"; 
... 
var googleUrl = "http://google.com"; 
... 
var log = formatter(googleUrl); 

W języku C# 7.0, można użyć funkcji lokalnego zamiast lambda, aby kod nieco prostsze i bardziej efektywne:

string formatter(string url) => $"URL: {url}"; 
... 
var googleUrl = "http://google.com"; 
... 
var log = formatter(googleUrl); 
+0

Miło, podoba mi się to. – dezzy

3

interpolacja String jest kompilator, a nie biblioteki , funkcja.

Otwory są nie nazwy, ale wyrażenia:

var r = new Rectangle(5, 4); 
var s = $"area: {r.Width + r.Heigh}": 

Jak byś zrobił, że do lokalizacji, jak pan zamierza?

Nawet r istnieje tylko w czasie kompilacji. W IL jest to po prostu pozycja na stosie zmiennych metody.

Zrobiłem to, co zamierzałeś zrobić dla zasobów i plików konfiguracyjnych.

Ponieważ do zastąpienia można użyć tylko skończonego zestawu "zmiennych", to co zrobiłem, to tablica (lub słownik, jeśli wolisz) i użyj wyrażenia regularnego, aby zastąpić nazwy w dziurach indeksem. To, co zrobiłem, nawet dozwolone dla specyfikatorów formatu.

+0

Część lokalizacyjna to '" area: "' w twoim przykładzie. Jednak +1 za wzmiankę o ekspresji. – CallMeLaNN

Powiązane problemy