Jak używasz ciągów dosłownych z interpolacją?

136

W C # 6 pojawiła się nowa funkcja: interpolowane ciągi.

Pozwalają one umieszczać wyrażenia bezpośrednio w kodzie, zamiast polegać na indeksach:

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

Staje się:

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

Jednak mamy wiele ciągów w wielu wierszach, używając ciągów dosłownych (głównie instrukcji SQL) w następujący sposób:

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

Przywrócenie ich do zwykłych ciągów wydaje się nieczytelne:

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

Jak używać razem ciągów dosłownych i interpolowanych?

Keith
źródło
3
Jeśli naprawdę chodzi o łańcuchy SQL, czy jest jakiś powód, dla którego zamiast tego nie używasz zapytań parametryzowanych?
svick
1
„Mamy wiele ciągów w wielu wierszach przy użyciu ciągów dosłownych (głównie instrukcje SQL)” brzmi tak, jakbyś dysponował dużą liczbą ciągów SQL umożliwiających ataki z iniekcją SQL.
Cetin Basoz
1
@svick jesteśmy, wszystko, co wprowadza użytkownik jest sparametryzowane. Nadal jednak intensywnie używamy dynamicznego SQL, ponieważ dynamicznie tworzymy SQL dla naszych encji w kodzie.
Keith
1
@CetinBasoz nie - wszystkie dane wejściowe użytkownika są sparametryzowane. Istnieje wiele okoliczności, w których masz dynamiczny SQL - na przykład LINQ lub dowolną inną platformę mapowania obiektów.
Keith

Odpowiedzi:

200

Możesz zastosować oba $i @przedrostki do tego samego ciągu:

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

Ponieważ zostały wprowadzone w C # 6 , interpolowane ciągi dosłowne musiały zaczynać się od tokenów $@, ale zaczynając od C # 8, można użyć $@lub@$ .

Keith
źródło
57
Opposite ( @$"...") nie działa, co prowadzi mnie tutaj.
Sinatr
12
@Sinatr yeah, to musi być $@"..."w tej kolejności.
Keith
37
Fakt, że $@działa, gdy @$nie działa, ma sens, kiedy się nad tym zastanowić. Kiedy się z tym pogubiłem, co zdarzało się często, kiedy zacząłem używać tej składni, zawsze mówiłem sobie: „interpoluj ten ciąg dosłowny”, ponieważ coś przeciwnego nie miałoby sensu.
Heki
1
@RayLuo niezupełnie, ale biorąc pod uwagę, jak szybko stały się różne serializery .NET JSON, prawdopodobnie i tak nie powinieneś bezpośrednio kodować JSON.
Keith
1
Jeśli zastosujesz duet do istniejącego const string, upuść const.
bvj