Подтвердить что ты не робот

Какой $-оператор должен означать для строки?

Итак, у меня только что был разговор с пользователем в разделе комментариев.

Me:

Year year = new Year{ State = States.Happy };

Им:

eventStream.ReceiveJoke += joke =>  
    Console.WriteLine($"Pretty nice joke: {joke}, Thanks!!!");

4b9b3361

Ответ 1

Это интерполированный строковый литерал, введенный в С# 6.

В целом это эквивалентно:

eventStream.ReceiveJoke += joke =>  
    Console.WriteLine(string.Format("Pretty nice joke: {0}, Thanks!!!", joke));

Компилятор ищет скобки внутри любого строкового литерала, введенного с помощью $, и применяет к нему форматирование строк. Вы можете использовать (в основном) произвольные выражения, а не просто переменные, например.

Console.WriteLine($"{year.State} {2000 + 16}"); // Happy 2016

Ответ 2

Это символ, который позволяет вам создавать интерполированную строку, это новая функция из С# 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

Теперь давайте посмотрим IL (в режиме отладки, не оптимизирован) от Receive6

.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.

Могу ли я использовать параметры форматирования, такие как 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 - это точно то же самое

Ответ 3

Короче говоря, это хороший способ улучшить читаемость кода и уменьшить его длину. Это намного лучше, чем оператор 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" не путается с спецификатором формата.

Через

Ответ 4

Это новая функция С# 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}";
}

Преимущества строковой интерполяции:

  • Строка значительно легче читать, чем сложная строка.
  • Уменьшение синтаксических ошибок, вызванных аргументами, приведенными в строке формата, которые находятся в неправильном порядке, или вообще отсутствует, и вызывает исключение.