C # Оператор Перегрузка приращения после исправления - PullRequest
0 голосов
/ 24 декабря 2009

Я кодирую класс даты и у меня возникают проблемы с приращением после исправления (приращение префикса выглядит нормально).

Вот пример кода:

public class date
{
    int year,
        month,
        day;

    public date(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }

    static public date operator ++(date d)
    { 
        return d.Next(d);
    }
}

Метод «Далее (дата d)» берет дату и возвращает дату завтрашнего дня (я для краткости оставил ее). Я молод в C #, чтобы понять, почему префикс в порядке, но увеличение постфикса ничего не делает. Но помните, что в C ++ у нас должно быть два метода вместо одного - для приращения префикса и постфикса.

Также нет ошибок или предупреждений при компиляции.

Ответы [ 5 ]

6 голосов
/ 24 декабря 2009

System.DateTime.AddDays

Спасите себя от эпической головной боли, основанной на свиданиях.

4 голосов
/ 24 декабря 2009

Ну, вы не показали метод Next, который был бы немного удобен ... в частности, он показывает, почему он должен принимать date в качестве аргумента. Я предполагаю, что ваш Next метод имеет недостатки.

Вы также не показали пример неудачного постинкремента. Вот упрощенный пример, который показывает, что работает :

using System;

public class Date
{
    int year, month, day;

    public Date(int d, int m, int y)
    {
        day = d;
        month = m;
        year = y;
    }

    public static Date operator ++(Date d)
    { 
        return d.Next();
    }

    private Date Next()
    {
        // Just a toy implementation, obviously
        return new Date(day + 1, month, year);
    }

    static void Main()
    {
        Date x = new Date(1, 2, 3);
        x++;
        Console.WriteLine(x.day); // Prints 2
    }
}

Обратите внимание, как печатается 2, показывая, что день был увеличен (точнее, x теперь относится к новому экземпляру Date, который имеет увеличенное значение дня).

Лично я не думаю, что в любом случае я бы ввел оператор ++ для класса Date, но не берите в голову. Я бы также предложил, чтобы конструктор был год / месяц / день, а не день / месяц / год; это более привычно и лучше подходит для ситуаций, когда вы хотите обеспечить большую точность с большим количеством параметров.

0 голосов
/ 07 марта 2012

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

Глядя на вашу реализацию "valid":

    if (day == 29 && month == 2 && (year % 4) != 0) return false; 
    if (day == 29 && month == 2 && (((year % 100) == 0) && ((year % 400) != 0))) return false; 

Сбой 29/2/2100, который является действительной датой, но ваш метод говорит, что это не так.

0 голосов
/ 09 февраля 2010
DateTime SchDate= DateTime.Now;
SchDate= SchDate.AddDays(1);

Какой день или месяц / год вы можете добавить

0 голосов
/ 24 декабря 2009

Джон, спасибо, вы абсолютно правы, позвольте мне добавить отсутствующий метод next (), который находится внутри класса:

    public date Next(date d)
    {
        if (!d.valid()) return new date();
        date ndat = new date((d.Day() + 1), d.Month(), d.Year());
        if (ndat.valid()) return ndat;
        ndat = new date(1, (d.Month() + 1), d.Year());
        if (ndat.valid()) return ndat;
        ndat = new date(1, 1, (d.Year() + 1));
        return ndat;
    }    

Так как это использует valid (), я прикреплю это также:

    public bool valid()
    {
        // This method will check the given date is valid or not.
        // If the date is not valid then it will return the value false.
        if (year < 0) return false;
        if (month > 12 || month < 1) return false;
        if (day > 31 || day < 1) return false;
        if ((day == 31 && (month == 2 || month == 4 || month == 6 || month == 9 || month == 11)))
            return false;
        if (day == 30 && month == 2) return false;
        if (day == 29 && month == 2 && (year % 4) != 0) return false;
        if (day == 29 && month == 2 && (((year % 100) == 0) && ((year % 400) != 0))) return false;
        /* ASIDE. The duration of a solar year is slightly less than 365.25 days. Therefore,
        years that are evenly divisible by 100 are NOT leap years, unless they are also
        evenly divisible by 400, in which case they are leap years. */
        return true;
    }

День (), Месяц () и Год (), я думаю, самоочевиден, но дайте мне знать, если они необходимы. У меня также есть метод previous (), который выполняет противоположность next (), который я хочу использовать в методе --mentment.

Теперь в моей программе

class Program
{
    static void Main()
    {
        date today = new date(7,10,1985);
        date tomoz = new date();

        tomorrow = today++; 

        tomorrow.Print();  // prints "7/10/1985" i.e. doesn't increment      
        Console.Read();
    }
}

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

Что касается порядка D / M / Y, да, я согласен, с более высокими частотными данными я могу видеть, как это улучшает ситуацию, я перейду к исправлению этого следующего.

...