Выполнение метода DateTime в Main - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно сделать простую программу, которая просит вас нажать кнопку дважды, один раз, чтобы запустить таймер, и второй раз, чтобы остановить его, затем он должен показать вам разницу в секундах с момента нажатия этих кнопок, ноЯ не могу найти способ написать код в Main. Я думаю, что мой класс Stoper сделан правильно, но я не совсем уверен.

Я пробовал разные способы использования ReadKey для присвоения начального DateTime переменной.

class Stoper
{
    DateTime czas_zakonczenia;
    DateTime czas;
    DateTime czas_rozpoczecia;

    private DateTime Czas_rozpoczecia
    {
        get
        {
            return Czas_rozpoczecia;
        }
    }

    public DateTime Start(DateTime czas_rozpoczecia)
    {
        return czas_rozpoczecia = DateTime.Now;
    }

    public DateTime Stop(DateTime czas_zakonczenia)
    {
        return czas_zakonczenia = DateTime.Now;
    }
    public void WyswietlCzas()
    {
        var czas = (Start(czas_rozpoczecia) - Stop(czas_zakonczenia)).TotalSeconds;

    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Kliknij dowolony przycisk gdy chcesz zaczac pomiar czasu.");
        Stoper s1 = new Stoper(Start());
    }
}

Ответы [ 4 ]

1 голос
/ 15 октября 2019
private static void Main(string[] args)
    {
        Console.WriteLine("Press any key to Start Timer");
        Console.ReadKey();
        Console.WriteLine("\nTimer Started");
        var startTime = DateTime.Now;
        Console.WriteLine("Press any key to Stop Timer");
        Console.ReadKey();
        var stopTime = DateTime.Now;
        var sb = "\n" + (stopTime - startTime);
        Console.WriteLine(sb);
    }
1 голос
/ 15 октября 2019

Используйте Секундомер класс:

private static void Main()
{
    Stopwatch stopWatch = new Stopwatch();

    Console.WriteLine("Press any key to start the timer.\n");
    Console.ReadKey();

    stopWatch.Start();

    Console.WriteLine("Press any key to stop the timer.\n");
    Console.ReadKey();

    stopWatch.Stop();

    Console.WriteLine($"Elapsed seconds: {stopWatch.Elapsed.TotalSeconds}");
    Console.ReadKey();
}
1 голос
/ 15 октября 2019

В вашем коде есть несколько проблем:


Это вызывает переполнение стека. Потому что вы используете свойство (с большой буквы C), где вы хотите использовать поле (с маленькой буквы c). C # чувствителен к регистру.

    private DateTime Czas_rozpoczecia
    {
        get
        {
            return Czas_rozpoczecia; 
        }
    }

Вы, вероятно, хотите это:

    private DateTime Czas_rozpoczecia
    {
        get
        {
            return czas_rozpoczecia; 
            //     ^ Small letter
        }
    }

Или даже это:

    private DateTime Czas_rozpoczecia => czas_rozpoczecia;

Вы используете аргумент сто же имя, что и поле? Затем вы присваиваете значение (аргументу?) И забываете об этом.

    public DateTime Start(DateTime czas_rozpoczecia)
    {
        return czas_rozpoczecia = DateTime.Now;
    }

Возможно, вы захотите использовать его следующим образом. Сохраните текущий DateTime в поле. И вы должны исправить это и для метода Stop.

    public DateTime Start()
    {
        czas_rozpoczecia = DateTime.Now;
    }

Разница между двумя DateTimes - это TimeSpan, и хранить его бесполезно, поскольку у вас уже есть все поля.

    public Double WyswietlCzas()
    {
        return (czas_rozpoczecia - czas_zakonczenia).TotalSeconds;

    }
}

Теперь исправьте основной код. Используйте ReadKey, чтобы дождаться ключа. И вызовите методы, используя экземпляр (s1), который вы только что создали.

        var s1 = new Stoper();
        Console.ReadKey();
        s1.Start();
        Console.ReadKey();
        s2.Stop();

И вы сможете понять, как печатать секунды самостоятельно.

1 голос
/ 15 октября 2019

Вам не нужен специальный класс для этого. Вы можете использовать класс StopWatch. Попробуйте что-то вроде этого:

static void Main(string[] args)
{
    Console.WriteLine("Press any key to start the timer");
    Console.ReadKey();

    Stopwatch sw = Stopwatch.StartNew();
    Console.WriteLine("Timer started. Press any key to stop");
    Console.ReadKey();

    sw.Stop();
    Console.WriteLine("The timer has stopped.");
    Console.WriteLine($"Elapsed time is: {sw.Elapsed.TotalSeconds} seconds.");
    Console.ReadLine();
}

Если вам нужно использовать пользовательский класс. В вашем классе есть несколько не относящихся к делу переменных, и логика также неверна. Вы можете переписать ваш класс примерно так: (не стесняйтесь переводить имена переменных / методов на ваш язык)

class Stoper
{
    public TimeSpan ElapsedTime { get; set; }

    private DateTime startDate;

    public void Start()
    {
        startDate = DateTime.Now;
    }

    public void Stop()
    {
        ElapsedTime = DateTime.Now - startDate;
    }
}

Затем вы можете использовать его таким же образом, какStopWatch класс используется выше:

static void Main(string[] args)
{
    Console.WriteLine("Press any key to start the timer");
    Console.ReadKey();

    Stoper s1 = new Stoper();
    s1.Start();
    Console.WriteLine("Timer started. Press any key to stop");
    Console.ReadKey();

    s1.Stop();
    Console.WriteLine("The timer has stopped.");
    Console.WriteLine($"Elapsed time is: {s1.ElapsedTime.TotalSeconds} seconds.");
    Console.ReadLine();
}
...