Reputation: 155702
In C# 6 there is a new feature: interpolated strings. These let you put expressions directly into code.
Rather than relying on indexes:
string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());
the above becomes:
string s = $"Adding \"{x}\" and {this.Y()} to foobar.";
However, we have a lot of strings across multiple lines using verbatim strings (mainly SQL statements) like this:
string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());
Reverting these to regular strings seems messy:
string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();
How to use both verbatim and interpolated strings together?
Upvotes: 191
Views: 41231
Reputation: 155702
You can apply both $
and @
prefixes to the same string:
string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";
When introduced in C# 6, interpolated verbatim strings had to start with the tokens $@
, but starting with C# 8, you can use either $@
or @$
.
Since C#11 we also have raw string literals, which give you a better way for large blocks like this.
Instead of @
you can use """
, and you can still combine it with $
:
string s = $"""
Result...
Adding "{x}" and {this.Y()} to foobar:
{x.GetLog()}
""";
This will produce the same output as the first example, but it's more readable. The C# compiler will strip any whitespace before the closing """
from every line, so the string can have the same indent as your code.
Upvotes: 276