2012-09-18 3 views
1

Я, очевидно, новичок, когда дело доходит до C#, и следующая программа из книги Чарльза Петцольда, которую я не совсем понимаю. Параметр в методе GetDouble представляет собой строку с именем prompt. Нигде это не объявлено, и я думаю, что это то, что меня пугает. Я вижу, что метод Main вызывает GetDouble и печатает три строки на консоли, но все это выглядит странно для меня. Является ли этот типичный дизайн программирования, или это не отраслевой стандарт, а для того, чтобы показать, как это можно сделать? Книга не дает ответа в любом случае. Мое собственное программирование не передало бы строку методу Main. Может кто-то помочь выправить меня?Параметры метода с обработкой исключений

using System; 

class InputDoubles 
{ 
    static void Main() 
    { 
     double dbase = GetDouble("Enter the base: "); 
     double exp = GetDouble("enter the exponent: "); 
     Console.WriteLine("{0} to the power of {1} is {2}", dbase, exp, Math.Pow(dbase, exp)); 
    } 

    static double GetDouble(string prompt) 
    { 
     double value = Double.NaN; 
     do 
     { 
      Console.Write(prompt); 
      try 
      { 
       value = Double.Parse(Console.ReadLine()); 
      } 
      catch 
      { 
       Console.WriteLine(); 
       Console.WriteLine("you enter an invalid number!"); 
       Console.WriteLine("please try again"); 
       Console.WriteLine(); 

      } 
     } 

     while (Double.IsNaN(value)); 
     return value; 

    } 
} 
+3

запрос является параметром и должен предоставляться при вызове GetDouble. И в вашем основном методе GetDouble действительно вызывается с параметром string. Параметр string просто не объявлен заранее, но внутри вызова метода. Вы также можете сначала объявить локальную строковую переменную, присвоить ей значение и передать эту переменную в GetDouble(). –

+0

это одно из направлений, с которым я знаком, и я думаю, почему программа выглядела настолько забавной для меня в первую очередь. – wootscootinboogie

+0

prompt - это параметр метода GetDouble(). «Введите базу:» и т. Д. Являются аргументами фактического вызова метода. –

ответ

3

Нигде это не объявлено, и я думаю, что это то, что меня пугает.

Подождите, это декларируется прямо там - в заголовке метода:

static double GetDouble(string prompt) 
//      ^^^^^^^^^^^^^ This is the declaration of prompt 

prompt отличается от других переменных, которые вы видели в том, что это не обычная переменная: это формальный параметр метода.

В отличие от обычных переменных, которые инициализацию и присваивают явно с оператором присваивания =, формальные параметры назначаются неявно силу вызова метода. Когда вы вызываете метод, вы передаете ему выражение с фактическим параметром , который действует как присвоение этого выражения формальному параметру. Представьте себе, что перед первым вызовом переменной prompt присваивается "Enter the base: ", а затем перед вторым вызовом назначается "enter the exponent: ", чтобы понять, что происходит, когда вы вызываете GetDouble.

+0

это вид проницательности, которую я искал. когда вы учите себя, и вы видите несколько разрозненных примеров того, как делать то же самое, что получается немного нечетким. только учился около недели, поэтому спасибо :) – wootscootinboogie

+0

Я перечитал это, и я думаю, что это отличное объяснение того, что происходит. ++! – wootscootinboogie

1

Метод GetDouble(string) делает только что - он получает двойной от входа.
Текст, который запрашивается пользователем, является параметром, потому что есть два разных значения для ввода: сначала базовое число, второе - показатель степени.
Задав подсказку параметру, метод GetDouble(string) может обрабатывать все, запрашивая у пользователя ввод данных для возврата значения.
Альтернативой будет запрос пользователя за пределами GetDouble(string). Какой из этих двух вариантов предпочтительнее, это вопрос вкуса.

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

+0

эта часть, которую я действительно знал :), но я не хотел делать необдуманный туманный вопрос, и я подумал, что добавление некоторого контекста может ускорить процесс помощи от сообщества. – wootscootinboogie

0

Вы можете изменить его таким образом. Он делает то же самое, но я думаю более понятным:

static void Main() 
{ 
    string messageForDbaseParam="Enter the base: "; 
    double dbase = GetDouble(messageForDbaseParam); 
    string messageForExpParam ="enter the exponent: "; 
    double exp = GetDouble(messageForExpParam); 
    Console.WriteLine("{0} to the power of {1} is {2}", dbase, exp, Math.Pow(dbase, exp)); 
} 


static double GetDouble(string prompt) 
{ 
    double value = Double.NaN; 
    Boolean incorrectValue=true; 
    while(incorrectValue) 
    { 
     Console.Write(prompt); 
     try 
     { 
      value = Double.Parse(Console.ReadLine()); 
      incorrectValue=false; 
     } 
     catch 
     { 
      Console.WriteLine("error"); 
     } 
    }   
    return value; 

} 
Смежные вопросы