Подтвердить что ты не робот

Каким должно быть значение по умолчанию в необязательном параметре DateTime?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

DateTime? myDate = null;

Из этого вы можете сделать параметр необязательным:

void Foo(DateTime? myDate = null)
{
}

Дальнейшее чтение в Nullable Types.

Это не единственный способ скинуть кошку, но вы можете использовать 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.

Ответ 2

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

Ответ 3

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

default(DateTime) == DateTime.MinValue

до Kind.

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

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

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

Даже int являются нулевыми, вы знаете? int?: -)

Ответ 4

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

Ответ 5

проверьте параметр 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);
}

Ответ 6

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

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

public void Foo(DateTime? value = null)
{
    if ( value == null )
    {
        value = ... // default
    } 
}

Ответ 7

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

public DateTime method1()
{

  if (condition)

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

  else

    return default(DateTime);

}

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

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

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

public DateTime? method2()
{

  if (condition)

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

  else

    return null;

}

Ответ 8

    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;

Ответ 9

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

Ответ 10

Зависит от вашего прецедента.

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

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

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

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