wake-up-neo.net

String Interpolation mit Formatvariable

Ich kann dies tun:

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

oder sogar so

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

Ich habe eine format an anderer Stelle definiert und verwende die Variable format, keine Inline-Zeichenfolge.

In C # 6 scheint dies unmöglich zu sein:

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 überhaupt eine String-Interpolation mit einer zuvor deklarierten Variable?

C # 6 scheint während des Kompilierens den String inline zu interpolieren. Erwägen Sie jedoch die Verwendung dieser Funktion für die Lokalisierung, definieren Sie ein Format in config oder haben Sie einfach das Format const in einer Klasse.

20
CallMeLaNN

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

Weil das:

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

ist in dieses kompiliert:

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

die Zeichenfolge in Runtime muss eine "reguläre" Formatzeichenfolge sein und nicht das Äquivalent der Zeichenfolgeninterpolation.

Sie können stattdessen den einfachen alten String.Format verwenden.

31
i3arnon

Ein Ansatz, um dies zu umgehen, wäre die Verwendung eines Lambda, das die interpolierte Zeichenfolge enthält. So etwas wie:

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

In C # 7.0 können Sie anstelle eines Lambda eine lokale Funktion verwenden, um den Code etwas einfacher und effizienter zu gestalten:

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

Die Zeichenketteninterpolation ist eine Compiler- und keine Bibliotheksfunktion.

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

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

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

Sogar r existiert nur zur Kompilierzeit. In IL ist dies nur eine Position auf dem variablen Stapel der Methode.

Ich habe getan, was Sie für Ressourcen und Konfigurationsdateien tun möchten.

Da Sie nur eine begrenzte Menge von "Variablen" als Ersatz verwenden können, habe ich ein Array (oder ein Wörterbuch, wenn Sie möchten) und einen regulären Ausdruck verwenden, um die Namen in den Bohrungen durch den Index zu ersetzen. Was ich sogar für Formatbezeichner erlaubte.

3
Paulo Morgado

Mehr von einer Idee als von einer Antwort.

Für das in der Frage gezeigte Beispiel können Sie Folgendes tun.

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

Ich habe ein aktuelles Projekt, bei dem ich häufig so etwas tun muss:

var label = "Some Label";
var value = "SomeValue";

//both label & value are results of some logic

var result = $"{label}: {value}";
0
Dimskiy