Строковые разрывы строк в C#: CRLF, CR или LF?
Сегодня я столкнулся с интересной проблемой, когда мои тесты постоянно терпели неудачу на сборочной машине, когда они отлично работали на моей машине, даже используя ту же конфигурацию. Когда я посмотрел на различия, выводимые Assert.AreEqual в дамп сбоя, я не увидел ничего другого. После нескольких исследований я пришел к выводу, что дословная строка в исходном коде тестового примера (которая занимала несколько строк) использовала CRLF на моем компьютере, но использовала LF на компьютере сборки, вызывая сравнение этой строки с сгенерированным строка потерпеть неудачу. Виновником оказались несовместимые настройки Git в двух системах, причем система сборки автоматически конвертировала последовательности CRLF в просто LF.
Говорит ли спецификация C# о том, как следует интерпретировать разрывы строк в дословных строках (возможно, используя Environment.Newline или, по крайней мере, что-то непротиворечивое)? Это кажется проблемой, которая может укусить многих людей в очень трудных для диагностики и трудных для исправления путях, особенно в.NET Standard. Например, если у вас есть проект.NET Standard, и у вас есть члены команды как в Linux, так и в Windows, это может привести к тому, что члены команды Linux или члены команды Windows будут кусаться.
2 ответа
Спецификация решает эту проблему, не обращаясь к ней:
В дословном строковом литерале символы между разделителями интерпретируются дословно, единственным исключением является quote_escape_sequence.
Поскольку для окончаний строк не делается никаких исключений, вы получаете те окончания строк, которые использовались в исходном файле. Как вы узнали.
Это решение, основанное на документации Git Help, может помочь обеспечить согласованность независимо от настроек каждого экземпляра Git.
Согласно документации в https://help.github.com/articles/dealing-with-line-endings/
При желании вы можете настроить способ, которым Git управляет окончаниями строк для каждого репозитория, путем настройки специального файла.gitattributes. Этот файл фиксируется в репозитории и переопределяет индивидуальный параметр core.autocrlf, обеспечивая согласованное поведение для всех пользователей, независимо от их настроек Git.