C # сделать в то время как Unassigned локальной проблемы переменной -- c# пол Связанный проблема

c# do while unassigned local variable problem


0
vote

проблема

русский
<Р> Я после C # курса и пытаюсь обновить мой метод ввода пользователя, чтобы проверить, если введенная входную консоль целое. Я написал сам в то время как сделать петлю, что я знаю, что не работает, но я борюсь немного с придумывая метод, который может как проверка значения и, если введенная переменная представляет собой целое число. <Р> Так что я пытался здесь было делать, в то время, пока введенный пользователем ввод не является Integer и между минимальным и максимальным значениями. Но я застрял на результат только устанавливается на значение в «если» блока, а не «еще» блока. Это не будет компилироваться, если результат не будет установлен на что-то, неназначенные переменный. И я понимаю, почему, потому что есть отделение, где я в конечном итоге с переменным без значения, и что не будет проходить в моем в то время как более-менее comparisson. Вы можете сравнивать только цифры, не аннулирует или строки. <Р> Должен ли я отказаться от делать-пока петля для чего-то более умное? Сейчас мой «хак» является результатом множества = 0 в случае, TryParse ложно. Это полезно только до тех пор, пока пользователь не нужно вводить 0, в этом случае все это не имеет никакого смысла больше.
 <код>  static int readInt(string prompt, int low, int high) // METHOD readInt      {         int result;         bool succes;         do         {             int temp;             string intString = readString(prompt);              succes = Int32.TryParse(intString, out temp);             if (succes)             { Console.WriteLine("The string was a number within the limits, {0}.", intString);                 result = int.Parse(intString);             }             else             {                     Console.WriteLine("{0} is not a valid number between {1} and {2}", intString, low, high);                 result = 0;             }          } while (!succes && (result < low) || (result > high));          return result;     }   
Английский оригинал

I am following a c# course and trying to upgrade my user input method to check if the entered console input is an integer. I have written myself into a do while loop that I know doesn't work, but I am struggling a bit with coming up with a method that can both check for value and if the entered variable is an integer.

So what I tried here was to do-while until the user entered input is an Integer and between the min and max values. But I get stuck on result is only set to a value in the 'if' block, not the 'else' block. It won't compile unless result is set to something, unassigned variable. And I understand why, because there is a branch where I end up with a variable without value, and that won't pass in my while greater-less comparisson. You can only compare numbers, not nulls or strings.

Should I abandon the do-while loop for something more clever? Right now my 'hack' is to set result = 0 in the case that TryParse is false. That is only useful as long as the user does not need to input 0, in which case the whole thing makes no sense any longer.

 static int readInt(string prompt, int low, int high) // METHOD readInt      {         int result;         bool succes;         do         {             int temp;             string intString = readString(prompt);              succes = Int32.TryParse(intString, out temp);             if (succes)             { Console.WriteLine("The string was a number within the limits, {0}.", intString);                 result = int.Parse(intString);             }             else             {                     Console.WriteLine("{0} is not a valid number between {1} and {2}", intString, low, high);                 result = 0;             }          } while (!succes && (result < low) || (result > high));          return result;     } 
</div
  
         
         

Список ответов

0
 
vote
vote
Лучший ответ
 

Это может быть проще просто использовать <код> while (true) LOOP и возвращение изнутри петли, когда у вас есть действительный результат. Это структурированная конструкция, известная как <код> loop with one exit , так что это нормально использовать (если вы беспокоитесь о структурированном программировании).

Например:

 <код> static int readInt(string prompt, int low, int high) // METHOD readInt  {     while (true)     {         string intString = readString(prompt);          if (Int32.TryParse(intString, out var result) && (result >= low) && (result <= high))         {             Console.WriteLine("The string was a number within the limits, {0}.", intString);             return result;         }         else         {             Console.WriteLine("{0} is not a valid number between {1} and {2}", intString, low, high);         }     } }   

Обратите внимание на использование относительно недавней функции C #, возможность объявления out переменная в точке использования с использованием <код> var Ключевое слово - см. <код> out var result внутри <код> TryParse() .

 

It might be easier to just use a while (true) loop and return from inside the loop when you have a valid result. This is a structured construct known as a loop with one exit, so it's fine to use (if you're worried about structured programming).

For example:

static int readInt(string prompt, int low, int high) // METHOD readInt  {     while (true)     {         string intString = readString(prompt);          if (Int32.TryParse(intString, out var result) && (result >= low) && (result <= high))         {             Console.WriteLine("The string was a number within the limits, {0}.", intString);             return result;         }         else         {             Console.WriteLine("{0} is not a valid number between {1} and {2}", intString, low, high);         }     } } 

Note the use of a relatively recent C# feature, the ability to declare an out variable at the point of use using the var keyword - see the out var result inside the TryParse().

</div
 
 
 
 
0
 
vote

или для более простого шаблона

 <код> UrlValidator urlValidator = new UrlValidator(); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); } 0  
 

Or for a simpler pattern

int result; string intString;  while (!int.TryParse(intString = Console.ReadLine(), out result) || result < low || result > high)    Console.WriteLine($"{intString} is not a valid number between {low} and {high}");  Console.WriteLine("The string was a number within the limits, {result}.");  return result; 
</div
 
 
0
 
vote

Вы можете изменить свой «Результат = int.parse (Intstring);» в «если» с «возвратом TEMP»;

У вас уже есть номер из твоего Tryparse, поэтому вам не нужно снова разбирать его; Возвращаясь внутри «Если» также удаляет необходимость назначать значение «привести к» внутри «else» на самом деле, вам не нужно «результат» вообще)

 <код> UrlValidator urlValidator = new UrlValidator(); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); } 1  
 

you can change your " result = int.Parse(intString);" in the "if" with "return temp";

you already have the number from your TryParse, so you do not need to parse it again; returning inside the "if" also removes the need to assign a value to 'result' inside the "else" in fact, you don't need "result" at all)

static int readInt(string prompt, int low, int high) // METHOD readInt  {     bool succes;     do     {         string intString = readString(prompt);          succes = Int32.TryParse(intString, out int temp);         if (succes)         { Console.WriteLine("The string was a number within the limits, {0}.", intString);             return temp;         }         else         {                 Console.WriteLine("{0} is not a valid number between {1} and {2}", intString, low, high);         }      } while (!succes && (result < low) || (result > high));  } 
</div
 
 
0
 
vote

У вас была пара ошибок в коде. Это работает:

 <код> UrlValidator urlValidator = new UrlValidator(); if (urlValidator.isValid("ftp://foo.bar.com/")) {    System.out.println("url is valid"); } else {    System.out.println("url is invalid"); } 2  
 

You had a couple of bugs in the code. This works:

    static int readInt(int low, int high)     {         int result;         bool success;         bool outOfLimits = false;         do         {             Console.Write("Enter a number: ");             string intString = Console.ReadLine();             success = Int32.TryParse(intString, out result);             if (!success)             {                 Console.WriteLine("{0} is not a valid number.", intString, low, high);                 continue;             }             outOfLimits = result < low || result > high;             if (outOfLimits)                 Console.WriteLine("The string was NOT a number between {1} and {2}.", intString, low, high);             else                 Console.WriteLine("The string was a number within the limits, {0}.", intString);          } while (!success || outOfLimits);         return result;     } 
</div
 
 
0
 
vote

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

Я бы попытался сделать код более прозрачным, переместив все проверки на предмет действительности в метод сам по себе. Тогда вы можете сделать что-то вроде этого.

 <код>    static int readInt(string prompt, int low, int high) // METHOD readInt      {         bool valid = false;         int result = 0;         while (!valid)         {             var intString = readString(prompt);             valid = checkIfValid(intString, low, high, out result);         }         return result;     }      static bool checkIfValid(string s, int low, int high, out int result)     {         if (!Int32.TryParse(s, out result))         {             Console.WriteLine(s + " isn't an integer");             return false;         }          if (result < low)         {             Console.WriteLine("Number is too low");             return false;         }          if (result > high)         {             Console.WriteLine("Number is too high");             return false;         }          return true;     }   
 

When code evolves like yours, it sometimes gets a bit unclear what it does as the complexity rises. Usually that's a sign that you should refactor it.

I would try to make the code clearer by moving all the checks for validity into a method by itself. Then you can do something like this.

   static int readInt(string prompt, int low, int high) // METHOD readInt      {         bool valid = false;         int result = 0;         while (!valid)         {             var intString = readString(prompt);             valid = checkIfValid(intString, low, high, out result);         }         return result;     }      static bool checkIfValid(string s, int low, int high, out int result)     {         if (!Int32.TryParse(s, out result))         {             Console.WriteLine(s + " isn't an integer");             return false;         }          if (result < low)         {             Console.WriteLine("Number is too low");             return false;         }          if (result > high)         {             Console.WriteLine("Number is too high");             return false;         }          return true;     } 
</div
 
 
 
 
0
 
vote

Попробуйте реализовать процедуру, подтверждающую условия один после одного (нам не нужно делать код слишком сложным с !succes && (result < low) || (result > high) check): < / P >.

  1. Если пользователь <код> input действительное целое число (<код> int.TryParse )?
  2. Если это действительно, это в пределах диапазона?

Если какая-либо валидация не удается просить пользователя:

 <код> static int readInt(string prompt, int low, int high)  {     // Keep on looping until we return a valid result     while (true)      {         // Or          // Console.WriteLine(prompt);           // string input = Console.ReadLine();         string input = readString(prompt);           int result = 0; // initialization: let the compiler be happy          if (!int.TryParse(input, out result)) // Do we have an syntactically invalid input?           Console.WriteLine($"{input} is not a valid integer number");         else if (result < low || result > high) // If result is valid; is it out of range?            Console.WriteLine($"{input} is out of [{low}..{high}] range");         else // result is valid integer and within the ranges: time to return it           return result;      } }   

 

Try implementing the routine validating the conditions one after one (we have no need to make code too complex with !succes && (result < low) || (result > high) check):

  1. If user input a valid integer (int.TryParse)?
  2. If valid is it within the range?

If any validation fails keep asking user:

static int readInt(string prompt, int low, int high)  {     // Keep on looping until we return a valid result     while (true)      {         // Or          // Console.WriteLine(prompt);           // string input = Console.ReadLine();         string input = readString(prompt);           int result = 0; // initialization: let the compiler be happy          if (!int.TryParse(input, out result)) // Do we have an syntactically invalid input?           Console.WriteLine($"{input} is not a valid integer number");         else if (result < low || result > high) // If result is valid; is it out of range?            Console.WriteLine($"{input} is out of [{low}..{high}] range");         else // result is valid integer and within the ranges: time to return it           return result;      } } 
</div
 
 
   
   

Связанный проблема

0  Внедрить свойство с пользовательским атрибутом  ( Implement property with custom attribute ) 
Может быть, я получаю концепцию пользовательских атрибутов не так, но я подумал, что это должно быть что-то, что было бы возможно: У меня есть класс со стро...

4  Какую книгу на TDD для C # с лечением издевателей  ( What book on tdd for c sharp with treatment of mocks ) 
Можете ли вы помнить книгу о тестировании подразделения и TDD для C #, по крайней мере, некоторое лечение отдельных объектов? Я видел эту Вопрос Но, похож...

12  Сырые запросы SQL и основной базы  ( Raw sql queries and entity framework core ) 
Я переносим свое приложение в Core Ass.net MVC Core и Framework Framework, и я нашел проблему. У меня есть RAW SQL-запрос к сущности, как это <код> var rawS...

0  Linq 2 SQL Использование содержит [дубликат]  ( Linq 2 sql using contains ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Неправильный выход LINQ сумма  ( Wrong output linq sum ) 
У меня есть эти данные ниже и сумма запроса LINQ. Но я не знаю, почему его вывод не то, что я ожидал. <Сильные> данные на DatateFaled - Tourndays - отме...

1  Служба окна в C # (ServiceProcessInsaller) - Ошибка 5: Доступ запрещен  ( Window service in c sharp serviceprocessinsaller error 5 access is denied ) 
Я использую Visual Studio 2008 и .NETFramework 3.5. Я разработал одно приложение Windows Service в C # с помощью файловой системы. Основная цель этого проекта...

1  Как я могу нарисовать кружком на моем приложении Bing Map вокруг центральной точки с радиусом, приведенным в милях  ( How do i draw a circle on my bing map application around a centerpoint with a ra ) 
Я смог нарисовать эллипс на моей карте, используя значения широты и долготы вокруг данной центральной точки. Хотя я вижу форму на карте, я получаю эллипс вмес...

2  SMTPClient отправляет RAW HTML  ( Smtpclient sending raw html ) 
Может ли кто-нибудь сказать мне, почему следующий код отправляет электронные письма в Raw HTML? Как в, электронная почта выглядит когда вы просматриваете исто...

1  C # WPF Toolkit DataGrid - Группа внутри группы?  ( C sharp wpf toolkit datagrid group inside group ) 
У меня есть группа, в которой есть элементы внутри нее, и я бы хотел, чтобы эта группа была подгруппа. <Сильные> Основные группы : «Windows», «Linux», «MAC»...

8  Требуется 407 аутентификация - не отправлено проблем  ( 407 authentication required no challenge sent ) 
<Сильное> Обновление: Если вы только что прибыли на этот вопрос, генеральный сигнал заключается в том, что я пытаюсь сделать httpwebrequest через прокси, и ...

0  Должен ли я использовать ExecuteNonQuery для этой команды резервного копирования БД  ( Should i use executenonquery for this db backup command ) 
<Р> У меня есть метод, который позволяет мне пнуть резервную копию базы данных. То, что я интересно, если я должен использовать ExecuteNonQuery () в этом конте...

1  ASP.NET Печать PDF непосредственно к принтеру с настройками  ( Asp net print pdf directly to printer with preferences ) 
Я работаю над проектом, который требует от нас отправлять PDFS на печатную прессу. Ранее мы сделали это с помощью настольного приложения и Acrobat, но я хотел...

0  HAL, чтобы десерифицировать ответ JSON, если количество полей от ответа не известно?  ( Haw to deserialize json response if the number of fields from the response not k ) 
С тех пор, как я не сейчас, сколько полей ответа JSON не смогу ли у вас сложный код, чтобы соответствовать объекту JSON. Что такое лучшая практика для десериа...

0  TreeView Checkbox Checked File и B папок Загрузка в ListView в C #  ( Treeview checkbox checked file and folder load in listview in c sharp ) 
Я хочу сделать аудиторский инструмент, который направлен на копирование файлов и папок. Я использую TreeView для загрузки файлов и папок с использованием ме...

2  Разрешения папки - некоторые или все ссылки на идентичность не могут быть переведены  ( Folder permissions some or all identity references could not be translated ) 
Я хотел бы установить папку ACL на удаленном сервере для пользователя домена, но всегда получайте следующее сообщение об ошибке: Некоторые или все ссылки н...

Связанный проблема

0  Внедрить свойство с пользовательским атрибутом 
4  Какую книгу на TDD для C # с лечением издевателей 
12  Сырые запросы SQL и основной базы 
0  Linq 2 SQL Использование содержит [дубликат] 
0  Неправильный выход LINQ сумма 
1  Служба окна в C # (ServiceProcessInsaller) - Ошибка 5: Доступ запрещен 
1  Как я могу нарисовать кружком на моем приложении Bing Map вокруг центральной точки с радиусом, приведенным в милях 
2  SMTPClient отправляет RAW HTML 
1  C # WPF Toolkit DataGrid - Группа внутри группы? 
8  Требуется 407 аутентификация - не отправлено проблем 
0  Должен ли я использовать ExecuteNonQuery для этой команды резервного копирования БД 
1  ASP.NET Печать PDF непосредственно к принтеру с настройками 
0  HAL, чтобы десерифицировать ответ JSON, если количество полей от ответа не известно? 
0  TreeView Checkbox Checked File и B папок Загрузка в ListView в C # 
2  Разрешения папки - некоторые или все ссылки на идентичность не могут быть переведены