Каким должно быть значение по умолчанию в необязательном параметре DateTime? - PullRequest
24 голосов
/ 20 октября 2011

Обычно, если у меня есть необязательный тип для необязательного параметра, я бы поставил ноль в качестве значения по умолчанию. Таким образом, я знаю, что если значение равно нулю, вызывающая сторона не хочет указывать какое-либо значение для этого.

public void Foo(string text, string text2= null);

Если параметр обычно является положительным целым числом, я могу использовать отрицательное число

public void Foo(string text, int index=-1);

Как насчет DateTime? Он не обнуляем, и (насколько я знаю) у него нет бессмысленного числа, которое также не может быть истинным вводом (например, -1 для положительного целого числа). Или есть? Что бы вы использовали в этой ситуации?

Я также знаю, что могу использовать тип nullable DateTime, но это означает, что вызывающий метод должен будет использовать Nullable, а не просто просто передавать DateTime.

Ответы [ 10 ]

33 голосов
/ 20 октября 2011

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

DateTime? myDate = null;

Отсюда вы можете сделать параметр необязательным:

void Foo(DateTime? myDate = null)
{
}

Дополнительная информация о типах Nullable.

Это не единственный способ снять шкуру с кошки, однако вы можете использовать default(DateTime), однако вы не можете использовать DateTime.MinValue, MaxValue или Now в дополнительных параметрах, поскольку они не компилировать постоянные времени.

Конечно, вам не нужно использовать необязательные параметры, вы можете использовать перегруженные методы, если хотите использовать Min, Max или Now.

void Foo()
{
    Foo(DateTime.MinValue);
}

void Foo(DateTime d)
{
}

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

class SmarterDateTime
{
    public bool IsSet { get; set; }

    // Wrapper around DateTime etc excluded.
}

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

Лично я склонен использовать DateTime.MinValue.

15 голосов
/ 20 октября 2011

default (DateTime) - для него предназначен оператор по умолчанию

6 голосов
/ 20 октября 2011

На вопрос «что может быть значением по умолчанию для DateTime» ответ должен быть таким: вы можете использовать только default(DateTime). Это потому, что значение по умолчанию должно быть const, а оба значения DateTime.MinValue и DateTime.MaxValue равны static readonly, но учтите, что

default(DateTime) == DateTime.MinValue

до Kind.

Если вы хотите, вы можете реализовать перегрузку с одним меньшим параметром (DateTime), и из этой перегрузки вызовите метод "main", передав значение, которое вы предпочитаете.

Но, как писали другие, проблема в том, что вы написали неверные посылки.

Нет, DateTime (как почти все ValueType с. Почти все, потому что Nullable<Nullable<int>> недопустимо, даже если Nullable<T> является ValueType) обнуляется, Nullable<DateTime> или DateTime? (тоже самое)

Даже int обнуляемы, вы знаете? int?: -)

5 голосов
/ 20 октября 2011

DateTime.MinValue будет значением по умолчанию.

4 голосов
/ 20 октября 2011

проверьте параметр по умолчанию dateTime, его значение будет 1/1/0001 12:00:00 AM,

private void M(Int32 x = 9, String s = “A”, DateTimedt = default(DateTime), Guidguid = new Guid()) {
Console.WriteLine(“x={0}, s={1}, dt={2}, guid={3}”, x, s, dt, guid);
}
3 голосов
/ 20 октября 2011

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

Если вы хотите установить значение по умолчанию в вашей функции, вы можете сделать:

public void Foo(DateTime? value = null)
{
    if ( value == null )
    {
        value = ... // default
    } 
}
2 голосов
/ 20 октября 2011

Фрагмент кода

public DateTime method1()
{

  if (condition)

    return new DateTime(2007, 5, 30, 11, 32, 00);

  else

    return default(DateTime);

}

Оператор по умолчанию инициализирует тип значения значением по умолчанию.В случае datetime это значение также отображается как статическое свойство с именем DateTime.MinValue.Если используется C # 1.0, оператор «default (DateTime)» будет эквивалентен «DateTime.MinValue».Вы могли бы использовать это специальное значение как своего рода значение «маркера», то есть, если оно возвращается, оно указывает на недопустимую дату и время.

Если снова использовать C # 2.0, также можно использовать так называемый обнуляемый типи фактически возвращает NULL, как показано в следующем примере

Фрагмент кода

public DateTime? method2()
{

  if (condition)

    return new DateTime(2007, 5, 30, 11, 32, 00);

  else

    return null;

}
1 голос
/ 20 октября 2011

Вы можете использовать значение DateTime.MinValue и использовать перегрузку.

1 голос
/ 20 октября 2011
    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;
0 голосов
/ 20 октября 2011

Зависит от вашего варианта использования.

Любые, которые не соответствуют реальным данным, будут работать, но это зависит от того, как вы их используете (в некотором смысле это равно -1 для целых чисел, поскольку это очень хорошее целое число только для того, чтобы вы его использовали, поскольку оно было только положительным целые числа имеют смысл).

Если вы отправляете минимальную дату (интересует все последующие foo), тогда подойдет любая дата, предшествующая самой ранней разумной дате, и код, подобный .Where(f -> f.When > myDate), будет работать даже без необходимости искать этот особый случай.

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

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

...