specification - опциональные параметры c#




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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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


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

default(DateTime) == DateTime.MinValue

вплоть до Kind .

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

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

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

Вы знаете, даже int являются обнуляемыми. int? :-)


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

public DateTime method1()
{

  if (condition)

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

  else

    return default(DateTime);

}

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

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

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

public DateTime? method2()
{

  if (condition)

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

  else

    return null;

}

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




optional-parameters