Как установить значение по умолчанию для DateTime в необязательном параметре?Установить значение по умолчанию для DateTime в необязательном параметре
public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
//Init codes here
}
Как установить значение по умолчанию для DateTime в необязательном параметре?Установить значение по умолчанию для DateTime в необязательном параметре
public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
//Init codes here
}
Существует обходное решение для этого, использующее типы с нулевым значением и тот факт, что 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 метода, которые вы написали, из одного с необязательным параметром ... Обычно я предпочитаю иметь один метод с несколькими необязательными параметрами вместо нескольких методов, что делает код меньше и, следовательно, его легче читать. – user276648
Вы можете использовать coalesce здесь: 'addedOn = addedOn ?? DateTime.Now' –
Nullables может вызвать проблемы с литьем в вашем коде, поэтому я не поклонник. Я все больше разочаровываюсь в C#. Я имею в виду, что даже у VB.net есть буквальные даты, такие как: Необязательно добавленоOn As DateTime = # 12: 00: 00 PM # – Brain2000
В этом смысле C# не имеет необязательных параметров. Если вы хотите сделать необязательным addedOn
, вы должны написать перегрузку, которая не требует этого параметра, и передает DateTime.Now
в версию с двумя аргументами.
er .. уверен, что это JS Bangs? для версии платформы .NET 3.5 и ниже вы правы. в противном случае, 4.0 и выше, поддерживается. –
@ Pure.Krome, значения по умолчанию для необязательных параметров должны быть константами времени компиляции. Так что это * не * поддерживается. (Однако этот ответ может быть сформулирован лучше.) –
Я слишком неправильно понял формулировку. соз JS. –
Не используйте дополнительный параметр:
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
}
.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.
Значение по умолчанию должно быть константой времени компиляции, поэтому это не будет работать даже в 4.0. –
Подтвержденные Anothony. Я переделаю свой пост. Приветствия. –
Я бы немного изменить решение LukeH как:
public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}
, который короче и более читаемым, это кажется.
Я думаю, что вы действительно не хотели 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.
Не понимайте, почему это не отмечено как ответ, это позволяет значительно упростить работу с datetime, так как datetime? ! = datetime – user3800527
Это правильный ответ. –
Я просто собираюсь озвучить то, что говорили другие, это правильный ответ. Остальные в основном просто обманывают систему. – CyberClaw
Это не дубликат Timespans работают по-разному в C#, чем в timespans.Это выполнимо в C# с 'DateTimeConstantAttribute', но временные интервалы этого не поддерживают. – leat