2015-01-19 2 views
0

Так что у меня есть вопрос, который запрашивает метод Movies, чтобы принять имя как строку и целое число (представляет время в минутах). Поэтому, если вы вызываете этот метод без целых минут, устанавливается значение по умолчанию 90. Тогда основной метод показывает, что вы можете вызвать метод movie только с помощью строки, чтобы показать, что вы можете вызывать ее со строкой и целым числом.Использование метода и передачи значений основному методу

static void Main() 
{ 
    Console.WriteLine("Movie title is {0}, and time is", MovieListing("x")); 
} 

private static string MovieListing(string name, int defaultTime = 60) 
{ 
    string Name, stringTime; 
    int time; 
    bool isValid; 
    Console.Write("What is the name of the movie?"); 
    Name = Console.ReadLine(); 
    Console.Write("What is the time of the movie? Default is 90 if left blank"); 
    stringTime = Console.ReadLine(); 
    time = Convert.ToInt32(stringTime);   
} 

Так Im оставил пустое мышление, как получить программу, чтобы сказать, если пользователь ввел временную Int и использовать его, или если они просто использовать по умолчанию 90 и передавая их обратно в основной метод пардон, если коды беспорядок пытался различными способами без особого успеха

+0

@VsevolodGoloviznin: У него уже есть. –

+0

Ваш вопрос непонятен. Как узнать, введен ли пользователь во время проверки, чтобы увидеть, что stringTime не пуст. Это очевидно, и я не знаю, почему вам нужно спросить об этом в качестве вопроса, так что вы действительно пытаетесь выяснить? – theMayer

+0

Как вы должны возвращать два значения, так как функция может иметь только один возвращаемый аргумент? Я сомневаюсь, что вам нужно использовать ref/out. Пожалуйста, уточните вопрос с точным требованием задачи. –

ответ

4

Вы можете использовать тройную операцию, чтобы проверить, если введенное значение пусто:

time = string.IsNullOrEmpty(stringTime) ? defaultTime : Convert.ToInt32(stringTime); 

он будет разбирать stringTime, если заполнено, иначе он будет принимать значение по умолчанию.

+1

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

+0

Полностью забыл об использовании IsNullOrEmpty! Спасибо вам – Tril

2

Вот лучший способ сделать это, используя простой объект Movie для хранения значений. Это должно напечатать две жёстко прописанные линии демо, а затем попросите пользователя для входа:

private class Movie 
{ 
    private readonly int _defaultLength = 90; 

    public string Title { get; set; } 
    public int Length { get; set; } 

    // constructor without length - use default length 
    public Movie(string title) 
    { 
     this.Title = title; 
     this.Length = _defaultLength; 
    } 

    // constructor with both properties 
    public Movie(string title, int length) 
    { 
     this.Title = title; 

     // make sure Length is valid 
     if (length > 0) 
      this.Length =length; 
     else 
      this.Length = _defaultLength; 
    } 
} 

static void Main() 
{ 
    // make a Movie object without length 
    var shortMovie = new Movie("Zombieland"); 

    // make a Movie object and specify length 
    var longMovie = new Movie("Lawrence of Arabia", 216); 

    Console.WriteLine("{0} is {1} minutes long", shortMovie.Title, shortMovie.Length); 
    Console.WriteLine("{0} is {1} minutes long", longMovie.Title, longMovie.Length); 

    // get input from user: title 
    Console.Write("What is the name of another movie?"); 
    var userTitle = Console.ReadLine(); 

    // get input from user: length 
    Console.Write("What is the length of {0}? Default is 90 if left blank", userTitle); 
    var userTime = Console.ReadLine(); 

    // try to convert user input to an int and call Movie constructor to create a new object 
    int userTimeConverted = 0; 
    Movie userMovie; 
    if (Int32.TryParse(userTime, out userTimeConverted)) 
    { 
     // make a new Movie object with the user's input 
     userMovie = new Movie(userTitle, userTimeConverted); 
    } 
    else 
    { 
     // make a new Movie object without the user's input 
     userMovie = new Movie(userTitle); 
    } 

    Console.WriteLine("{0} is {1} minutes long", longMovie.Title, longMovie.Length); 
} 

Построив отдельную Movie объект, мы можем переместить большинство или все логики, необходимой для хранения длины по умолчанию и проверять, если длина действительна из метода Main(). Это, надеюсь, будет намного чище и легче читать.

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

+0

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

+0

Вы имеете в виду вызов его без разветвления или хранения результата «bool»? И спасибо. Ура! –

+0

Если вы пытаетесь разобрать что-то, всегда должно быть хорошее/плохое решение. В этом случае использование другого конструктора имеет смысл. –

0

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

private static string MovieListing(string name, int defaultTime = -1) 
{ 
    var isDefaultUsed = false; 
    if (defaultTime = -1) 
    { 
     isDefaultUsed = true; 
     defaultTime = 60; 
    } 
    string Name, stringTime; 
    int time; 
    bool isValid; 
    Console.Write("What is the name of the movie?"); 
    Name = Console.ReadLine(); 
    Console.Write("What is the time of the movie? Default is 90 if left blank"); 
    stringTime = Console.ReadLine(); 
    time = Convert.ToInt32(stringTime);   
}