Установите значение по умолчанию для DateTime в необязательном параметре

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

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}

Ответ 1

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

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    if (!addedOn.HasValue)
        addedOn = DateTime.Now;

    //Init codes here
}

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

public SomeClassInit(Guid docId)
{
    SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}

Ответ 2

Я бы немного изменил решение LukeH как:

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}

который короче и читабельнее, кажется.

Ответ 3

Я предполагаю, что вы действительно не хотели addedOn = DateTime.Now, потому что это предполагало, что вы никогда не получите никакого результата, поскольку все будет добавлено до "Сейчас".:)

Значение по умолчанию DateTime может быть установлено следующим образом:

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime))

Обновление
Если вы имеете дело с SQL Server, не забывайте, что он не принимает значение по умолчанию (DateTime), что равно 1/1/0001. Минимальный срок службы SQL Server DateTime равен 1/1/1753 (объяснение). SQL DateTime2 принимает 1/1/0001, однако.

Ответ 4

Не используйте необязательный параметр:

public SomeClassInit(Guid docId, DateTime addedOn)
{
    SomeClassInitCore(docId, addedOn);
}

public SomeClassInit(Guid docId)
{
    SomeClassInitCore(docId, null);
}

private SomeClassInitCore(Guid docId, DateTime? addedOn)
{
    // set default value
    if (addedOn.IsNull) addedOn = DateTime.Now;

    //Init codes here
}

Ответ 5

.NET 4.0 имеет необязательные параметры. (Google тоже ваш друг, здесь.)

ИЗМЕНИТЬ (из-за того, что Энтони Пегэм прав, комментарий)...

И да, так вы бы это сделали.

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

.NET 3.5 не... поэтому вам нужно будет сделать то, что сказал JS Bangs...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
}

или даже параметр null check/null value из munificent answer.

Приветствия Энтони.

Ответ 6

В этом смысле С# не имеет необязательных параметров. Если вы хотите сделать addedOn необязательным, вы должны написать перегрузку, которая не требует этого параметра, и передает DateTime.Now в версию с двумя аргументами.