Używanie zmiennych wewnątrz łańcuchów

89

W PHP mogę wykonać następujące czynności:

$name = 'John';
$var = "Hello {$name}";    // => Hello John

Czy istnieje podobna konstrukcja języka w C #?

Wiem, że jest, String.Format();ale chcę wiedzieć, czy można to zrobić bez wywoływania funkcji / metody w ciągu.

thwd
źródło

Odpowiedzi:

223

W C # 6 możesz użyć interpolacji ciągów :

string name = "John";
string result = $"Hello {name}";

Podświetlanie składni tego w programie Visual Studio sprawia, że ​​jest on bardzo czytelny, a wszystkie tokeny są sprawdzane.

Fenton
źródło
88

Ta funkcja nie jest wbudowana w język C # 5 lub niższy.
Aktualizacja: C # 6 obsługuje teraz interpolację ciągów, zobacz nowsze odpowiedzi.

Zalecanym sposobem na zrobienie tego byłoby String.Format:

string name = "Scott";
string output = String.Format("Hello {0}", name);

Jednak napisałem małą bibliotekę open source o nazwie SmartFormat, która rozszerza się String.Formattak, że może używać nazwanych symboli zastępczych (poprzez odbicie). Więc możesz zrobić:

string name = "Scott";
string output = Smart.Format("Hello {name}", new{name}); // Results in "Hello Scott".

Mam nadzieję że ci się spodoba!

Scott Rippey
źródło
2
Jaki rodzaj spadku wydajności wiąże się z używaniem implementacji odbicia w porównaniu ze standardowym ciągiem znaków.
styfle
Widzę, że masz już stronę wydajności na wiki. Wygląda to całkiem obiecująco. Dobra robota!
styfle
Tak, wydaje mi się, że strona dotycząca wyników prawdopodobnie odpowiada na Twoje pytanie, ale nie przeprowadziłem żadnych porównań między „Hello {0}” a „Hello {name}”. Oczywiście refleksja potrwa dłużej. Jednak użycie funkcji buforowania poprawia wydajność analizowania i może zminimalizować różnicę. Tak czy inaczej, wszystko jest SZYBKIE!
Scott Rippey
1
To już nie jest prawdą. C # 6 dodał to jako funkcję
Cole Johnson
5

Do C # 5 (-VS2013) musisz wywołać dla niej funkcję / metodę. Albo „normalna” funkcja, taka jak String.Formatalbo przeciążenie operatora +.

string str = "Hello " + name; // This calls an overload of operator +.

W C # 6 (VS2015) wprowadzono interpolację ciągów (opisaną w innych odpowiedziach).

Anders Abel
źródło
5

Użyj następujących metod

1: Metoda pierwsza

var count = 123;
var message = $"Rows count is: {count}";

2: Metoda druga

var count = 123;
var message = "Rows count is:" + count;

3: Metoda trzecia

var count = 123;
var message = string.Format("Rows count is:{0}", count);

4: Metoda czwarta

var count = 123;
var message = @"Rows
                count
                is:{0}" + count;

5: Metoda piąta

var count = 123;
var message = $@"Rows 
                 count 
                 is: {count}";
Abn Najaf
źródło
1
Byłoby miło dodać komentarz, dlaczego wybrałbyś każdą z tych metod.
ZombieCode