Я заметил, что никто не ответил на реальные вопросы.
Что-то теряется при чтении данных в строку?
Файл JPEG содержит изображение, а не слова. Этот bicture имеет двоичное представление в виде последовательности байтов. Некоторые из этих байтов имеют значение 0x00, также представленное как NUL. В строке байт, содержащий это значение, интерпретируется как маркировка конца строки. Данные после конца строки обрабатываются как неиспользуемый буфер и игнорируются.
Когда вы записываете строку в файл, ничего после первого NUL не включается. В результате файл не является полным двоичным изображением и отклоняется логикой проверки программного обеспечения, пытающегося интерпретировать его как JPEG.
Таким образом, данные, как правило, теряются при загрузке строки с нетекстовыми данными. Проблема в том, что вы фактически сделали неверный тип, но ни компилятор, ни среда выполнения не остановили вас, и в результате произошло повреждение данных.
Для чего это действительно хорошо?
Несколько вещей. Как уже говорили другие, строки предназначены для содержания текста. В .NET строки поддерживают кодировки, отличные от простого старого ASCII. Существует также обширная поддержка для манипулирования текстом. Посмотрите спецификаторы формата в справке для наглядного примера манипуляции со строками.
Почему строки C # используют NUL для конца строки?
Это устаревшая вещь. NUL не очень хорош для всего остального, и это упрощает сортировку строк в управляемом коде и из него. BSTR делает то же самое по тем же причинам.