Почему DateTime является структурой в .Net? - PullRequest
15 голосов
/ 31 октября 2009

Почему DateTime структура вместо наследуемого класса?

(Я хотел бы иметь возможность переопределить метод ToString (), но не могу.)

Ответы [ 8 ]

17 голосов
/ 31 октября 2009

Вероятно, потому что это была небольшая, простая и неизменная структура данных, очень похожая на целое или десятичное число. Создание структуры в этих условиях делает использование DateTime очень эффективным. Если бы это было сделано классом, это преимущество эффективности было бы потеряно, потому что это потребовало бы выделения памяти каждый раз, когда вы создаете новый DateTime.

Кроме того, сколько вариантов форм DateTime вы можете придумать? (Игнорирование альтернативных реализаций ToString, которые вы имеете в виду.) Это не совсем тот тип, который вызывает полиморфизм.

Обратите внимание, что для использования другой стратегии форматирования для ваших DateTimes, как я думаю, вы захотите, вам лучше взглянуть на другой способ форматирования, чем просто использование ToString. Если вы посмотрите на интерфейс ICustomFormatter в MSDN, вы увидите, как вы можете подключиться к конвейеру String.Format для переопределения форматирования без необходимости поднабора существующего типа.

13 голосов
/ 31 октября 2009

Вы можете использовать методы расширения для этого: Объявить расширение:

public static class DateTimeExtensions
{
    public static string ToStringFormatted(this DateTime date)
    {
        return date.ToString("{d}");
    }
}

Используйте расширение:

using DateTimeExtensions;
...
var d = new DateTime();
System.Diagnostics.Debug.WriteLine(d.ToStringFormatted());

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

Ссылка: Методы расширения (c #)

12 голосов
/ 31 октября 2009

Потому что это одна точка.У него нет нескольких частей данных.Под капотом она представлена ​​длинной.

5 голосов
/ 31 октября 2009

То, что это структура (или даже если это был запечатанный класс), не означает, что это конец пути. Вы можете решить эту проблему с помощью композиции , а не наследования. Вот пример «объективирования» класса DateTime:

public class MyDateTime
{
    DateTime? value;

    public MyDateTime()
    {
        this.Value = DateTime.Now;
    }

    public MyDateTime(DateTime? dateTime)
    {
        this.Value = dateTime;
    }

    public override String ToString()
    {
        if (this.Value != null)
        {
            return this.Value.Value.Month.ToString() + " my favorite time of the year";
        }

        return null;
    }

    public System.DateTime? Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
}
5 голосов
/ 31 октября 2009

Если вы хотите узнать больше о системных классах и структурах, загрузите бесплатный рефлектор .NET (http://www.red -gate.com / products / refleor / ).

В любом случае, если вы хотите изменить форматирование DateTime, предоставьте свой собственный IFormatProvider. Используйте .NET Reflector, чтобы узнать, как реализован DateTimeFormatInfo, а затем реализуйте свой собственный.

4 голосов
/ 31 октября 2009

Я считаю, что это структура, потому что структуры являются типами значений, а классы являются ссылочными типами. Фактические данные в DateTime представляют собой одно длинное целое число. Если бы это был класс, каждый раз, когда вы создавали новый объект, в куче было бы выделено 8 байт, а в стеке для указателя было бы выделено еще 8 байтов. Таким образом, делая DateTime структурой, он эффективно сокращает требования к памяти в два раза.

Вы можете найти больше информации в этом вопросе .

3 голосов
/ 31 октября 2009
  • DateTime имеет небольшой размер. Поэтому неэффективно выделять для этого память в куче.

  • Логично сделать его копирование при назначении, не создавая ссылку на тот же объект, тем более что он неизменный. То же самое верно для работы на нем (Add, Substract и т. Д.)

  • Он должен был быть преобразован в соответствующую структуру COM.

Если вам нужно пользовательское форматирование, вы можете реализовать его так, как показано здесь .

2 голосов
/ 31 октября 2009

Вам не нужно переоценивать метод ToString(), просто проверьте шаблоны здесь вам не нужны другие :)

более подробный пост здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...