Подтвердить что ты не робот

Почему Environment.NewLine = "\ r\n", когда "\n" в строковом литерале функционирует одинаково?

В С#, если вы делаете что-то вроде string newLine = Environment.NewLine; и проверяете значение newLine, вы обнаружите, что это "\r\n". Однако, если я что-то типа:

  string[] test = new string[] { "one", "two", "three" };

  Console.WriteLine("With plain slash n:");
  Console.Write(String.Join("\n", test));
  Console.WriteLine("\nWith Environment.NewLine:");
  Console.Write(String.Join(Environment.NewLine, test));

Вывод функционально одинаков.

Почему Environment.NewLine установлен на \r\n вместо \n? Разве это не просто затрудняет преобразование из строки в массив символов? Также я прочитал что-то, что заставило меня поверить, что некоторые поля ввода не учитывают Environment.NewLine как два символа, которые могут вызвать проблемы, если ваши поля поддержки ограничены длиной поля ввода. Есть ли для этого какие-то положительные причины? Это просто унаследованный рывок в этот момент?

4b9b3361

Ответ 1

Точка Environment.NewLine должна возвращать символ новой строки для платформы. Предположительно для реализаций платформы .NET на Linux или Unix она вернет только\n.

Ответ 2

"Новая строка" в windows/dos, по соглашению, CR + LF ("\r\n", "\ x0D\x0A" ). В мире * nix "новая строка", по соглашению, имеет один символ LF ( "\n", "\ 0A" ). В мире Macintosh, предшествующем OS X, "новая строка", опять же по соглашению, имеет один символ LF ( "\ r", "\ x0D" ). Бросьте мэйнфреймы IBM в микс и тем хуже: контрольный набор управления EBCDIC содержит CR, LF и специальный управляющий символ NL.

Причина этого имеет исторический характер и связана с тем фактом, что ASCII не имеет фактического символа управления NL (новой строкой): он имеет только CR (возврат каретки) и LF (линия). Различные ОС были разработаны с различными терминалами печати и их интерпретацией значения этих управляющих символов, на которых были разработаны различные операционные системы, и у вас есть новый раскол в новой строке.

Система ввода/вывода CLR пытается следовать закону Postel ( "Быть ​​щедрым в том, что вы принимаете и строгим в том, что вы испускаете" ), и поэтому является агностиком при вводе новых правил WRT. Следовательно, стандартные реализации CLR TextReader принимают любой из CR + LF, CR или LF как составляющий новый индикатор строки. Однако на выходе WriteLine() по умолчанию добавляет значение `Environment.NewLine '.

Ответ 3

DOS и Windows используют комбинацию возврата каретки (\ u000D) + Line Feed (новая строка \n\u000A) для представления одной новой строки. Различные платоформы имеют разные настройки (см. Wiki-NewLine). Таким образом, С# соответствует стандарту для Windows и DOS, как ожидалось, когда приложение запускается в Windows.