web-dev-qa-db-fra.com

Interpolation de chaîne avec une variable de format

Je peux le faire:

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

ou même comme ça

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

J'ai un format défini ailleurs et j'utilise la variable format, pas la chaîne en ligne.

En C # 6, cela semble impossible:

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

Est-il possible d'utiliser une interpolation de chaîne avec une variable déclarée précédemment?

C # 6 semble interpoler la chaîne en ligne pendant la compilation. Cependant, envisagez d'utiliser cette fonctionnalité pour la localisation, définissez un format dans config ou simplement un format const dans une classe.

20
CallMeLaNN

Non, vous ne pouvez pas utiliser l'interpolation de chaîne avec autre chose qu'un littéral de chaîne, car le compilateur crée une chaîne de format "normal" même lorsque vous utilisez une interpolation de chaîne. 

Car ce:

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

est compilé dans ceci:

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

la chaîne au moment de l'exécution doit être une chaîne de format "normal" et non l'équivalent en interpolation de chaîne.

Vous pouvez utiliser le vieux String.Format à la place.

31
i3arnon

Une approche pour contourner ce problème consisterait à utiliser un lambda contenant la chaîne interpolée. Quelque chose comme:

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

En C # 7.0, vous pouvez utiliser une fonction locale au lieu d'un lambda, pour rendre le code légèrement plus simple et plus efficace:

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

L'interpolation de chaîne est un compilateur, pas une bibliothèque, une fonctionnalité.

Les trous ne sont pas des noms, mais des expressions:

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

Comment feriez-vous cela pour la localisation, comme vous le souhaitez?

Même r n'existe qu'au moment de la compilation. En IL, il ne s'agit que d'une position sur la pile de variables de la méthode.

J'ai fait ce que vous avez l'intention de faire pour les ressources et les fichiers de configuration.

Comme vous ne pouvez utiliser qu'un ensemble fini de "variables" à substituer, ce que j'ai fait est de disposer d'un tableau (ou d'un dictionnaire, si vous préférez) et d'utiliser une expression régulière pour remplacer les noms des trous par son index. Ce que j'ai fait a même permis des spécificateurs de format.

3
Paulo Morgado

Plus d'une idée par opposition à une réponse.

Pour l'exemple présenté dans la question, vous pouvez procéder comme suit.

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

J'ai un projet réel où je dois faire quelque chose comme ça:

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

//both label & value are results of some logic

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