Boxing при интерполяции строк в c#

198
27 июня 2018, 15:50

Есть код 1

int i = 123;
string s = $"{i}";

И есть код 2

int i = 123;
string s = $"{i.ToString()}";

В первом варианте будет происходить боксинг или с интерполяцией не происходит такого и компилятор понимает что надо вызвать ToString?

Answer 1

1)

string s = $"{i}";

превращается в string.format, который принимает object'ы, боксинг присутствует

2)

string s = $"{i.ToString()}";

передается строка, боксить нечего

Answer 2

В первом варианте будет происходить боксинг

Да.

с интерполяцией не происходит такого и компилятор понимает что надо вызвать ToString?

Ваше утверждение "надо вызвать ToString" не является корректным, так как "надо" вызвать вовсе не тот ToString, который вызываете Вы.

using System;
class Test {
    struct S: IFormattable {
        public override string ToString() => "Object.ToString";
        public string ToString(string format, IFormatProvider formatProvider) => "IFormattable.ToString";
    }
    public static void Main()
    {
        S s = new S();
        Console.WriteLine($"{s}");
        Console.WriteLine($"{s.ToString()}");
    }
}

https://ideone.com/gRz74U

Так как поведение String.Format не является частью стандарта языка C#, то компилятор не имеет права выполнять, предложенную Вами, оптимизацию, так как он не может знать какой именно ToString нужно вызвать и с какими параметрами.

Более того, если определение типа S находится в другой сборке, то на этапе компиляции компилятор даже не будет иметь достаточного количества информации, чтобы определить, какой метод вызвать.

READ ALSO
Запись в файл, который используется в другом процессе

Запись в файл, который используется в другом процессе

Проблема такова: я создаю файл в папке dropbox, он сразу начинает обрабатываться и появляется ситуация, что файл используется процессом dropboxЕсть...

235
Строки одной таблицы как столбец в другой

Строки одной таблицы как столбец в другой

Допустим есть БД для хранения постовПост, как сущность в приложении может представлять из себя примерно следующий класс:

189
Определение границ массива sqlReader

Определение границ массива sqlReader

Как определить границу sqlReader[r] чтобы не вылетать за пределы массива

185
Отправка картинки на сервер WPF - Web Api Core - C#

Отправка картинки на сервер WPF - Web Api Core - C#

Не совсем понимаю некоторые вещи в веб технологиях

368