boxing na strukturach podczas wywoływania ToString ()
Często zastanawiałem się, czy następujący scenariusz rzeczywiście ma miejsce w c #
Jeśli mam struct, ale nie przesłonię jawnie żadnej z metod wywodzących się z obiektu, takich jak ToString (), GetHashCode (), itp., To jeśli zadeklaruję lokalną instancję mojej struct class i wywołam 'ToString ()' on to, czy mój struct uzyskać boxed tj. czy CLR konwertuje go niejawnie do obiektu na stercie, a następnie wywołać ToString ()? Czy też jest wystarczająco sprytny, aby wiedzieć, że nie ma implementacji dla tej struktury i zignorować ją?
to znaczy
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?
.....
}
== Edytuj - Aktualizuj == Mehrdad'slink do MSDN, będąc użytecznym, pomieszało mnie z lekka. Zacytuję i zobaczę, czy ktoś może to dla mnie usunąć
Gdy instrukcja metody callvirt została poprzedzona ograniczeniem tego typu, instrukcja jest wykonywana w następujący sposób:
Jeśli thisType jest typem odniesienia (w przeciwieństwie do typu wartości), to ptr jest odwoływany i przekazywany jako wskaźnik „this” do metody callvirt metody.
Jeśli thisType jest typem wartości, a metoda thisType implementuje metodę, to ptr jest przekazywane niezmodyfikowane jako wskaźnik „this” do instrukcji metody wywołania dla implementacji metody przez tenType.
Jeśli thisType jest typem wartości, a thisType nie implementuje metody, to ptr jest odwoływany, umieszczany w ramce i przekazywany jako wskaźnik „this” do instrukcji metody callvirt.
Czy to oznacza, że jeśli nie zastosuję jawnie ToString () na moim typie struktury, to wpadnie on do ostatniego przypadku i zostanie zapakowany? A może gdzieś źle to rozumiem?