Здравствуйте, кывтчане!
Помогите, пожалуйтса, собрать все случаи проявления боксинга в C#, а то я уже опух искать опкод box в msil-коде framework'а
Из спеки C# такие вытекают такие случаи:
Приведения типа-значения к System.Object:
struct S { }
object box = new S();
Приведения типа-значения к System.ValueType:
struct S { }
System.ValueType box = new S();
Приведения типа-перечисления к System.Enum:
enum E { A }
System.Enum box = E.A;
Приведения типа-значения к типу интерфейса:
interface I { }
struct S : I { }
I box = new S();
Создание делегата из метода уровня экземпляра типа-значения:
struct S { public void M() {} }
System.Action box = new S().M;
Более интересные случаи:
В конкатенации строк с типами-значениями:
char c = F();
string s1 = "char value will box" + c;
Вызовы
не_переопределённых виртуальных методов, "унаследованных" от System.Object:
enum E { A }
E.A.GetHashCode();
Вызовы base-реализаций виртуальных методов, унаследованных от System.Object в методах типа-значения:
struct S {
public override string ToString() {
return base.ToString();
}
}
Вызов не виртуального метода Object.GetType() на типе-значении (спасибо _FRED_'у):
struct S { }
new S().GetType();
Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили
Меня в первую очередь интересуют именно конструкции языка C#, которые ещё могут порождать боксинг в неожиданных местах.
Заранее спасибо.
Здравствуйте, Пельмешко, Вы писали:
П>[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)
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
Так что нада, что то менять
Здравствуйте, Пельмешко, Вы писали:
П>Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили
Интересно, не знал. А в какой версии языка это сделали?
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, кывтчане!
П>Помогите, пожалуйтса, собрать все случаи проявления боксинга в C#, а то я уже опух искать опкод box в msil-коде framework'а
П>Из спеки C# такие вытекают такие случаи:
А если рефлектором конвертнуть ваш код в IL и посмотреть код на предметы боксирования/выделения памяти?
Здравствуйте, Петрухин Эдуард, Вы писали:
П>>Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили
ПЭ>Интересно, не знал. А в какой версии языка это сделали?
В бэте 2-го дотнета, если не изменяет память.