Боксинг в C#
От: Пельмешко Россия blog
Дата: 03.11.11 15:47
Оценка: 81 (7) +1
#Имя: FAQ.dotnet.cs.boxing
Здравствуйте, кывтчане!

Помогите, пожалуйтса, собрать все случаи проявления боксинга в C#, а то я уже опух искать опкод box в msil-коде framework'а
Из спеки C# такие вытекают такие случаи:


Более интересные случаи:


Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили
Меня в первую очередь интересуют именно конструкции языка C#, которые ещё могут порождать боксинг в неожиданных местах.

Заранее спасибо.
Re[2]: Боксинг в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.12 13:19
Оценка: 4 (1)
Здравствуйте, Петрухин Эдуард, Вы писали:

П>>Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили


ПЭ>Интересно, не знал. А в какой версии языка это сделали?


В бэте 2-го дотнета, если не изменяет память.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Боксинг в C#
От: LastExile Украина  
Дата: 02.02.12 08:17
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>[list]

П>* В конкатенации строк с типами-значениями:
П>
П>char c = F();
П>string s1 = "char value will box" + c;
П>


В этом случае, лучше написать

char c = F();
string s1 = "char value will not box" + c.ToString();


И тогда боксирования не будет. Думаю причина в том, что в вашем случае, компилятор просто готовит аргументы для вызова метода
Concat(Object, Object)
Re[2]: Боксинг в C#
От: LastExile Украина  
Дата: 02.02.12 08:24
Оценка:
LE>В этом случае, лучше написать

LE>
LE>char c = F();
LE>string s1 = "char value will not box" + c.ToString();
LE>


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

LE>Concat(Object, Object)

И как дополнение, ReSharper 6.0 предупреждает
Redundant Object.ToString call for value type


Так что нада, что то менять
Re: Боксинг в C#
От: Петрухин Эдуард Россия  
Дата: 02.02.12 08:37
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили


Интересно, не знал. А в какой версии языка это сделали?
Re: Боксинг в C#
От: dimchick Украина  
Дата: 02.02.12 13:01
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, кывтчане!


П>Помогите, пожалуйтса, собрать все случаи проявления боксинга в C#, а то я уже опух искать опкод box в msil-коде framework'а

П>Из спеки C# такие вытекают такие случаи:

А если рефлектором конвертнуть ваш код в IL и посмотреть код на предметы боксирования/выделения памяти?
Re: Боксинг в C#
От: Алексей.  
Дата: 02.02.12 20:38
Оценка:
Здравствуйте, Пельмешко, Вы писали:

Из спеки также вытекают:
1. Boxing при приведении nullable-типов к Object, ValueType, Enum и их базовым интерфейсам.
2. Boxing при приведении generic-параметров которые не is-known-to-be-a-reference-type к Object, ValueType и их базовым интерфейсам.

П>В конкатенации строк с типами-значениями


Этот случай аналогичен приведению типа-значения к System.Object.

П>Вызовы не_переопределённых виртуальных методов, "унаследованных" от System.Object

П>Вызовы base-реализаций виртуальных методов, унаследованных от System.Object в методах типа-значения
П>Вызов не виртуального метода Object.GetType() на типе-значении (спасибо _FRED_'у)

По-моему это все сводится к одному правилу — вызов метода определенного в базовом классе типа-значения (Object, ValueType, Enum).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.