Я часто задавался вопросом, действительно ли происходит следующий сценарий в С#
Если у меня есть структура, но я явно не переопределяю ни один из методов, которые производятся от объекта, такого как ToString(), GetHashCode() и т.д., тогда, если я объявляю локальный экземпляр моего класса структуры и вызываю "ToString ( ) 'на нем, будет ли моя структура получаться в коробке, т.е. CLR конвертирует ее неявно в объект в куче, а затем вызывает ToString()? Или это достаточно умно, чтобы знать, что для этой структуры нет реализации и игнорировать ее?
то есть
public struct Vector2D
{
public float m_x;
public float m_y;
...... etc
}
void SomeFunc()
{
Vector2D aVec = new Vector2D();
Console.WriteLine(aVec.ToString()); // <-- does aVec get boxed here?
.....
}
== Редактировать - Обновить == Mehrdad ссылка на MSDN, в то время как полезность сбила меня с толку. Я процитирую и посмотрю, может ли кто-нибудь раскрыть это для меня.
Когда команда метода callvirt имеет префикс ограниченного thisType, инструкция выполнена следующим образом:
Если этот тип является ссылочным типом (как против типа значения), то ptr разыменован и передан как 'this'указатель на callvirt метода.
Если этот тип является типом значения и thisType реализует метод, тогда ptr прошел без изменений в качестве 'this'указатель на инструкцию метода вызова, для реализации метода путем thisType.
Если этот тип является типом значения и thisType не реализует метод то ptr разыменовывается, помещается в коробку и передается как указатель 'this' на callvirt.
Значит ли это, что если я не буду явно использовать ToString() для моего типа структуры, то он попадет в последний случай и получит коробку? Или я не понимаю его где-то?