2010-06-13 4 views
61

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

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

Это не дубликат Timespans работают по-разному в C#, чем в timespans.Это выполнимо в C# с 'DateTimeConstantAttribute', но временные интервалы этого не поддерживают. – leat

ответ

97

Существует обходное решение для этого, использующее типы с нулевым значением и тот факт, что 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 
} 
+1

Я действительно не понимаю, почему необязательные параметры должны быть константами времени компиляции. Компилятор может легко создать 2 метода, которые вы написали, из одного с необязательным параметром ... Обычно я предпочитаю иметь один метод с несколькими необязательными параметрами вместо нескольких методов, что делает код меньше и, следовательно, его легче читать. – user276648

+6

Вы можете использовать coalesce здесь: 'addedOn = addedOn ?? DateTime.Now' –

+0

Nullables может вызвать проблемы с литьем в вашем коде, поэтому я не поклонник. Я все больше разочаровываюсь в C#. Я имею в виду, что даже у VB.net есть буквальные даты, такие как: Необязательно добавленоOn As DateTime = # 12: 00: 00 PM # – Brain2000

2

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

+1

er .. уверен, что это JS Bangs? для версии платформы .NET 3.5 и ниже вы правы. в противном случае, 4.0 и выше, поддерживается. –

+1

@ Pure.Krome, значения по умолчанию для необязательных параметров должны быть константами времени компиляции. Так что это * не * поддерживается. (Однако этот ответ может быть сформулирован лучше.) –

+1

Я слишком неправильно понял формулировку. соз JS. –

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

.NET 4.0 does have optional parameters. (google is also your friend, здесь.)

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

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

Но 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 
} 

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

Cheers Anthony.

+0

Значение по умолчанию должно быть константой времени компиляции, поэтому это не будет работать даже в 4.0. –

+0

Подтвержденные Anothony. Я переделаю свой пост. Приветствия. –

21

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

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

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

19

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

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

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

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

+0

Не понимайте, почему это не отмечено как ответ, это позволяет значительно упростить работу с datetime, так как datetime? ! = datetime – user3800527

+0

Это правильный ответ. –

+0

Я просто собираюсь озвучить то, что говорили другие, это правильный ответ. Остальные в основном просто обманывают систему. – CyberClaw

Смежные вопросы