Подобные трюки с отображением структуры не могут работать без маршаллера P / Invoke. Внутренняя организация структуры не обнаруживается. JIT-компилятор с готовностью использует это, он меняет местами члены, если это создает меньший объем памяти для структуры. Только [StructLayout] может пригвоздить его.
В пространстве имен Microsoft.VisualBasic есть еще одна полезность, которая упрощает эту задачу. Класс TextFieldParser может легко преобразовывать подобные строки одним вызовом. Например:
using System;
using System.IO;
using Microsoft.VisualBasic.FileIO; // NOTE: add reference to Microsoft.VisualBasic
class Program {
static void Main(string[] args) {
var strm = new StringReader("John Doe New York Test Comment");
var parse = new TextFieldParser(strm);
parse.TextFieldType = FieldType.FixedWidth;
parse.SetFieldWidths(16, 10, 12);
foreach (var field in parse.ReadFields())
Console.WriteLine(field.Trim());
Console.ReadLine();
}
}
Обратите внимание, что исходная строка, которую вы разместили, не соответствует объявлению структуры, мне пришлось изменить ширину поля. Также обратите внимание, что TextFieldParser принимает любой поток, это не обязательно должна быть строка, хранящаяся в StringReader. StreamReader, который читает файл, будет более типичным использованием.