Итак, у меня только что был разговор с пользователем в разделе комментариев.
Me:
Year year = new Year{ State = States.Happy };
Им:
eventStream.ReceiveJoke += joke =>
Console.WriteLine($"Pretty nice joke: {joke}, Thanks!!!");
Итак, у меня только что был разговор с пользователем в разделе комментариев.
Me:
Year year = new Year{ State = States.Happy };
Им:
eventStream.ReceiveJoke += joke =>
Console.WriteLine($"Pretty nice joke: {joke}, Thanks!!!");
Это интерполированный строковый литерал, введенный в С# 6.
В целом это эквивалентно:
eventStream.ReceiveJoke += joke =>
Console.WriteLine(string.Format("Pretty nice joke: {0}, Thanks!!!", joke));
Компилятор ищет скобки внутри любого строкового литерала, введенного с помощью $
, и применяет к нему форматирование строк. Вы можете использовать (в основном) произвольные выражения, а не просто переменные, например.
Console.WriteLine($"{year.State} {2000 + 16}"); // Happy 2016
Это символ, который позволяет вам создавать интерполированную строку, это новая функция из С# 6, и мне она нравится.
И его синтаксический сахар, я объясню, что это значит в конце.
public string Receive(int value)
{
return String.Format("Received: {0}", value);
}
public string Receive6(int value)
{
return $"Received: {value}";
}
Они будут иметь одну и ту же реализацию IL, посмотрите здесь IL (в режиме Debug, не оптимизированный) из Получить
.method public hidebysig instance string Receive (int32 'value') cil managed
{
// Method begins at RVA 0x22d4
// Code size 22 (0x16)
.maxstack 2
.locals init (
[0] string
)
IL_0000: nop
IL_0001: ldstr "Received: {0}"
IL_0006: ldarg.1
IL_0007: box [mscorlib]System.Int32
IL_000c: call string [mscorlib]System.String::Format(string, object)
IL_0011: stloc.0
IL_0012: br.s IL_0014
IL_0014: ldloc.0
IL_0015: ret
} // end of method Program::Receive
.method public hidebysig instance string Receive6 (int32 'value') cil managed
{
// Method begins at RVA 0x22f8
// Code size 22 (0x16)
.maxstack 2
.locals init (
[0] string
)
IL_0000: nop
IL_0001: ldstr "Received: {0}"
IL_0006: ldarg.1
IL_0007: box [mscorlib]System.Int32
IL_000c: call string [mscorlib]System.String::Format(string, object)
IL_0011: stloc.0
IL_0012: br.s IL_0014
IL_0014: ldloc.0
IL_0015: ret
} // end of method Program::Receive6
Как вы можете видеть своими глазами, IL почти одинаково.
В информатике синтаксический сахар является синтаксисом в языке программирования, который предназначен для упрощения чтения или выражения. Это делает язык "более сладким" для человеческого использования: вещи могут быть выражены более четко, более кратко или в альтернативном стиле, который некоторые могут предпочесть.
От https://en.wikipedia.org/wiki/Syntactic_sugar
Поэтому вместо того, чтобы писать массивный string.Format
, используйте строповую интерполяцию, компилятор будет работать для вас и преобразует синтаксис, который вы написали, в другом коде, в этом случае, используя string.Format
.
Да, вы можете посмотреть ниже
public static string Receive(int value)
=> string.Format("Received: {0, 15:C}", value);
public static string Receive6(int value)
=> $"Received: {value,15:C}";
Console.WriteLine(Receive(1));
Console.WriteLine(Receive6(1));
Console.WriteLine($"Current data: {DateTime.Now: MM/dd/yyyy}")
Выход (моя культура - pt-br)
Received: R$ 1,00
Received: R$ 1,00
Current data: 01/01/2016
Обобщение: Я хотел бы упомянуть, что разница в производительности не существует, поскольку используется строковая интерполяция e string.Format - это точно то же самое
Короче говоря, это хороший способ улучшить читаемость кода и уменьшить его длину. Это намного лучше, чем оператор String.Concat
или +, потому что строковая интерполяция выполняется только один раз как String.Format
(и она фактически компилируется при вызове метода String.Format
), и вы можете просто прочитать выражение слева направо.
String.Format
, и его кузены очень универсальны и полезны, но их использование немного неуклюже и подвержено ошибкам. Особенно неудачно использование{0}
и т.д. Заполнителей в строке формата, которые должны совпадать с аргументами, предоставленными отдельно:var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);
Интерполяция строк позволяет помещать выражения прямо на место, имея "отверстия" непосредственно в строковом литерале:
var s = $"{p.Name} is {p.Age} year{{s}} old";
Как и в случае с
String.Format
, могут быть заданы дополнительные параметры выравнивания и форматирования:var s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";
Содержимое отверстий может быть почти любым выражением, включая даже другие строки:
var s = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";
Обратите внимание, что условное выражение заключено в скобки, так что: "s" не путается с спецификатором формата.
Это новая функция С# 6, которая называется интерполяцией строк, которая
позволяет вам более легко форматировать строки. String.Format и его кузены очень универсальные, но их использование несколько неудобно и подвержено ошибкам.
Для получения дополнительной информации об этом, пожалуйста, посмотрите здесь.
Пример
Пусть мы имеем следующий класс:
public class Customer
{
public int Id { get; set; }
public string FirstName {get; set;}
public string LastName { get; set; }
}
и предположим, что мы хотим использовать метод ToString
, как показано ниже:
public override string ToString()
{
return string.Format("The customer with Id: {0} has as FirstName: {1} and as LastName: {2}", Id, FirstName,
LastName);
}
В С# 6 мы могли бы получить тот же результат, используя строчную интерполяцию.
public override string ToString()
{
return $"The customer with Id: {Id} has as FirstName: {FirstName} and as LastName: {LastName}";
}
Преимущества строковой интерполяции: