Wie verwendet man wörtliche Zeichenfolgen mit Interpolation?

132

In C # 6 gibt es eine neue Funktion: interpolierte Zeichenfolgen.

Mit diesen können Sie Ausdrücke direkt in Code einfügen, anstatt sich auf Indizes zu verlassen:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

Wird:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

Wir haben jedoch viele Zeichenfolgen über mehrere Zeilen hinweg, wobei wörtliche Zeichenfolgen (hauptsächlich SQL-Anweisungen) wie folgt verwendet werden:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

Das Zurücksetzen auf normale Zeichenfolgen scheint chaotisch:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

Wie verwende ich sowohl wörtliche als auch interpolierte Zeichenfolgen zusammen?

Keith
quelle
3
Wenn es wirklich um SQL-Zeichenfolgen geht, gibt es einen Grund, warum Sie stattdessen keine parametrisierten Abfragen verwenden?
Svick
1
"Wir haben viele Zeichenfolgen in mehreren Zeilen mit wörtlichen Zeichenfolgen (hauptsächlich SQL-Anweisungen)" klingt so, als hätten Sie viele SQL-Zeichenfolgen, die SQL-Injection-Angriffe ermöglichen.
Cetin Basoz
1
@svick wir sind, alle Benutzereingaben sind parametrisiert. Wir verwenden dynamisches SQL jedoch immer noch stark, da wir dynamisch SQL für unsere Entitäten im Code erstellen.
Keith
1
@CetinBasoz wir nicht - alle Benutzereingaben sind parametrisiert. Es gibt viele Umstände, unter denen Sie über dynamisches SQL verfügen - beispielsweise LINQ oder ein anderes Objektzuordnungsframework.
Keith

Antworten:

193

Sie können beide $und @Präfixe auf dieselbe Zeichenfolge anwenden :

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

Da wird in C # 6 eingeführt , interpoliert wörtlich Strings mit den Token starten musste $@, aber beginnend mit C # 8, können Sie entweder $@oder@$ .

Keith
quelle
56
Opposite ( @$"...") funktioniert nicht, was mich hierher bringt.
Sinatr
12
@ Sinatr ja, es muss $@"..."in dieser Reihenfolge sein.
Keith
35
Die Tatsache, dass es $@funktioniert, wenn @$es nicht funktioniert, macht vollkommen Sinn, wenn Sie darüber nachdenken. Wenn ich darüber verwirrt bin, was häufig vorkam, als ich anfing, diese Syntax zu verwenden, sagte ich mir immer: "Interpoliere diese wörtliche Zeichenfolge", weil das Gegenteil keinen Sinn ergeben würde.
Heki
1
@ RayLuo nicht wirklich, aber angesichts der Geschwindigkeit, mit der verschiedene .NET JSON-Serialisierer geworden sind, sollten Sie JSON wahrscheinlich sowieso nicht direkt codieren.
Keith
1
Wenn Sie das Duo auf ein vorhandenes anwenden const string, lassen Sie das fallen const.
bvj