Keith
Keith

Reputation: 155702

How to use verbatim strings with interpolation?

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

Answers (1)

Keith
Keith

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

Related Questions