у m_firstChar.Распределение кучи достаточно велико, чтобы вместить всю строку, а не только первый символ.Также легко увидеть в Visual Studio:
class Program {
static void Main(string[] args) {
string s = "hello" + "world";
} // <=== Breakpoint here
}
Когда достигается точка останова, используйте Debug + Windows + Memory + Memory1.В поле Адрес введите s.Вы увидите:
0x01B3F6BC e8 0a 67 6e 0b 00 00 00 0a 00 00 00 68 00 65 00 è.gn........h.e.
0x01B3F6CC 6c 00 6c 00 6f 00 77 00 6f 00 72 00 6c 00 64 00 l.l.o.w.o.r.l.d.
- Объект начинается с адреса - 4, там хранится syncblk (не видно).
- Следующие 4 байта - указатель таблицы методов(0x6e670ae8, ручка типа aka).
- Следующие 4 байта - это член m_arrayLength, выделенный размер строки (0x0b).
- Следующие 4 байта являются членом m_stringLength, фактическим количеством символов в строке (0x0a).
- Следующие байты хранят строку, начиная с m_firstChar.
Это для .NET 3.5 SP1.Вы не увидите члена m_arrayLength в .NET 4.0 и выше, поле было удалено.