Путают с консолью.Значение ReadLine() в .NET 6.0. при нажатии [Enter] без каких-либо других входных данных

#c# #.net-6.0

Вопрос:

Я пишу консольное приложение с некоторой базовой функцией, позволяющей пользователю вводить данные и реагировать на них на основе пользовательского ввода. В предыдущей версии(.net 3.1) я мог делать такие вещи, как это:

 string str=Console.ReadLine();
if(str==""){
     Console.WriteLine("do this");
}
else {
     Console.WriteLine("do that");
}
 

Поскольку это новая ОС, я просто пытаюсь установить .net-6.0, не слишком задумываясь.
Но, из-за некоторого обновления в .net-6.0, возвращаемый тип консоли.ReadLine() теперь является строкой? который может быть аннулирован, и код станет следующим:

 string? str=Console.ReadLine();
if(str==""){
     Console.WriteLine("do this");
}
else {
     Console.WriteLine("do that");
}
 

Поскольку я хочу получить ввод от пользователя, я могу игнорировать предупреждение здесь, чтобы использовать ту же кодировку, что и .net3.1, будет string? str=Console.ReadLine() ли значение null и вызовет исключение nullreference. Или по какой причине я могу сгенерировать null из консоли.Строка чтения();

Комментарии:

1. Если вы перенаправляете ввод в свою программу, когда консоль. Строка чтения не может прочитать больше входных данных, так как перенаправленный ввод был израсходован, затем Консоль. Строка чтения вернет значение null.

2. Если вы хотите, чтобы часть «если-то» реагировала на «ничего не введено или больше не нужно извлекать текст», вам следует вместо этого использовать if (string.IsNullOrEmpty(str)) {

Ответ №1:

Console.ReadLine() возвращает null , когда ввод поступает из переданного / перенаправленного STDIN (а не из интерактивной консоли), и перенаправленный поток достигает конца; как таковой , Console.ReadLine() может возвращаться null и всегда может.

То, что вы видите, — это функция c# 8: типы ссылок с возможностью обнуления-где string? это просто формализуется как «ссылка на строку, которая, как мы ожидаем, будет нулевой», в отличие string от того, что означает «ссылка на строку, которая никогда не должна быть нулевой». Ключевым моментом здесь является то, что возврат не изменился — просто: компилятор теперь признает, что null это возможность, которую вам следует рассмотреть.

Следующая программа примет переданный по конвейеру ввод, прочитает его до конца и запишет количество найденных строк:

 int count = 0;
while (Console.ReadLine() is not null) count  ;
Console.WriteLine(count);
 

при использовании, например (от cmd ):

 MyExe < somefile
 

Однако при использовании в интерактивном терминале: он никогда не закончится, пока вы не убьете его с ctrlпомощью c

Ответ №2:

Согласно документации Console.ReadLine , метод возвращает только null в том случае, если больше нет входных данных:

Следующая строка символов из входного потока или значение null, если больше строк недоступно.

Тем не менее, это хорошо проверить в null любом случае:

 string? str=Console.ReadLine();

if (string.IsNullOrEmpty(str))
{
     Console.WriteLine("do this");
}
else
{
     Console.WriteLine("do that");
}
 

Альтернативно, если вы абсолютно уверены, что не будет null, просто используйте ! (null-forgiving) operator