2015-09-02 9 views
14

kann ich dies tun:String Interpolation mit Formatvariable

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

oder auch wie dieser

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

Ich habe eine format irgendwo anders definiert und verwenden Sie die format Variable, nicht als Inline-String.

In C# 6, das ist unmöglich scheint:

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

Gibt es trotzdem String-Interpolation mit zuvor deklarierte Variable zu benutzen?

C# 6 scheint die Zeichenfolge während der Kompilierzeit inline zu interpolieren. Berücksichtigen Sie jedoch, dass Sie diese Funktion für die Lokalisierung verwenden, ein Format in der Konfiguration definieren oder einfach das Format const in einer Klasse haben.

+0

Sie können das nicht tun. Verwenden Sie einfach 'string.Format'. – SLaks

+0

Sie müssen "die alte Methode" verwenden, die Sie verwendet haben, oder sie in die private Methode einbetten. –

Antwort

24

Nein, Sie können die String-Interpolation nicht mit einem anderen als einem String-Literal verwenden, da der Compiler eine "normale" Formatzeichenfolge erstellt, auch wenn Sie die String-Interpolation verwenden.

Da dies:

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

wird in dieser zusammengestellt:

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

die Saite in der Laufzeit muss eine "reguläre" Format-Zeichenkette sein und nicht die Zeichenkette Interpolation äquivalent.

Sie können stattdessen die einfache alte String.Format verwenden.

+0

Ich stimmte zu. Ich dachte logischerweise '{name}' '' '' '{0}' 'Mapping kann in der Laufzeit an der ersten Stelle gemacht werden, aber die' string.Format' Parameter sollten inline kompiliert werden. Ich kann also nicht einfach das neue '{name2}' dynamisch in Variable einführen. – CallMeLaNN

+0

aber zumindest sollte es 'const string' akzeptieren. Der Compiler kann dann das Token "{...}" herausfinden und die Parameter 'string.Format' konstruieren. Wie auch immer, keine große Sache. – CallMeLaNN

+0

@CallMeLaNN dies würde funktionieren * nur * wenn die Konstante innerhalb der Methode definiert wurde, so dass der Compiler die Platzhalter auflösen (und validieren) konnte. Wie könnte der Compiler ansonsten entscheiden, ob eine * konstante * String auf Klassenebene gültig ist, wenn seine Platzhalter nur in * Methoden * existieren? –

-3

Es scheint, dass Sie es wie folgt tun:

var googleUrl = "http://google.com"; 
var url = $"URL: {googleUrl}"; 

System.Console.WriteLine(url); 

Sie können um weitere Informationen zu überprüfen, in https://msdn.microsoft.com/en-us/library/dn961160.aspx

+2

Sie haben den Punkt dieser Frage vollständig verpasst –

17

Ein Ansatz um das zu arbeiten, um eine Lambda mit dem interpoliert Zeichenfolge zu verwenden wäre. Etwas wie:

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

In C# 7.0, eine lokale Funktion anstelle eines Lambda verwenden könnte, der Code etwas einfacher zu machen und effizienter:

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

Schön, das gefällt mir. – dezzy

3

String-Interpolation ist ein Compiler, nicht Bibliothek , Feature.

Die Löcher sind keine Namen, aber Ausdrücke:

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

Wie würden Sie das tun, für die Lokalisierung, wie Sie beabsichtigen?

Sogar r existiert nur zur Kompilierzeit. In IL ist es nur eine Position auf dem Variablenstapel der Methode.

Ich habe getan, was Sie für Ressourcen und Konfigurationsdateien tun wollen.

Da Sie nur eine endliche Menge von "Variablen" ersetzen können, was ich getan habe, war ein Array (oder ein Wörterbuch, wenn Sie bevorzugen) und verwenden Sie einen regulären Ausdruck, um die Namen in den Löchern mit seinem Index zu ersetzen. Was ich tat, erlaubte sogar Formatangaben.

+0

Der Lokalisierungsteil ist '' area: '' in Ihrem Beispiel. +1 für Erwähnung über Ausdruck. – CallMeLaNN

Verwandte Themen