Значение по умолчанию набора для DateTime в дополнительном параметре [дубликат]

Этот вопрос уже имеет ответ здесь:

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

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
80
задан PiotrWolkowski 15 December 2015 в 02:32
поделиться

4 ответа

Для этого есть обходной путь, использующий типы, допускающие значение NULL, и тот факт, что 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
}
124
ответ дан 24 November 2019 в 09:51
поделиться

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

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
ответ дан 24 November 2019 в 09:51
поделиться

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

2
ответ дан 24 November 2019 в 09:51
поделиться

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

EDIT (из-за правильного комментария Энтони Пеграма)...

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

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

.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 
}

или даже параметр проверки нуля/нулевого значения из ответа munificent.

С уважением, Энтони.

4
ответ дан 24 November 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: