Необходимо ли заменить "\ n" на Environment.NewLine в литеральных строках, используемых в кроссплатформенных приложениях? - PullRequest
0 голосов
/ 01 марта 2020

Поскольку Environment.NewLine имеет различный вывод в зависимости от работающей платформы, необходимо ли заменить "\n" на Environment.NewLine в литеральных строках, используемых в коде для кроссплатформенных приложений?

Например, я хочу показать "Hello World\nI am fine!". Должен ли я заменить его на $"Hello World{Environment.NewLine}I am fine!"? Между прочим, это выглядит очень сложно.

Бонусный вопрос: когда производится замена? Во время компиляции или во время выполнения?

Редактировать:

class Program
{
    static string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "data.txt");
    static void Main(string[] args)
    {
        string input = $"I love Xamarin.Forms!\nHow about you?";

        File.WriteAllText(path, input);
        string output = File.ReadAllText(path);

        string[] list = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

        Console.WriteLine($"words: { list.Length}");
    }
}

Выходные данные words: 1, а не words: 2.

1 Ответ

2 голосов
/ 01 марта 2020

Нужно ли заменять "\ n" на Environment.NewLine в литеральных строках, используемых в кроссплатформенных приложениях?

Если вы хотите делать кроссплатформенные вещи вообще: да .

Но ... если вы читаете из входного потока, форматирование которого известно, или если вы записываете в выходной поток, который ожидает спецификацию c символ, чем: нет .


Вроде много работы; и это вроде как. Но это хорошая практика и помогает справляться с некоторыми особыми случаями чтения файлов.

Обратите внимание, те же учетные записи для каталогов символов разделителя.

В случае / против \ использование переменных, зависящих от платформы, более тривиально.


Что касается бонусного вопроса:

Если я не ошибаюсь ... Их знает каркас, установленный на машине.

На моем windows machine, он расположен в: mscorlib.dll и определен как:

[__DynamicallyInvokable]
public static string NewLine
{
  [__DynamicallyInvokable] get
  {
     return "\r\n";
  }
}

Итак, он встроен в mscorelib - что говорит о том, что он известен во время сборки. Но обратите внимание; он внешний, поэтому не встроен в ваш код. Его нельзя оптимизировать до постоянной, поскольку это внешний вызов.

Но, если честно ... Мне нужно в этом разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...