Establecer el valor predeterminado para DateTime en el parámetro opcional [duplicar]


Esta pregunta ya tiene una respuesta aquí:

¿Cómo puedo establecer el valor predeterminado para DateTime en el parámetro opcional?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
Author: PiotrWolkowski, 2010-06-13

6 answers

Hay una solución para esto, aprovechando los tipos nullables y el hecho de que null es una constante en tiempo de compilación. (Es un poco de un truco sin embargo, y yo sugeriría evitar a menos que realmente no se puede.)

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

    //Init codes here
}

En general, preferiría el enfoque estándar de sobrecarga sugerido en las otras respuestas:

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

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}
 108
Author: LukeH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 06:28:31

Supongo que realmente no querías addedOn = DateTime.Now porque eso sugeriría que nunca obtendrías ningún resultado, ya que todo se agregaría antes de 'Ahora'. :)

Un valor predeterminado DateTime se puede establecer así:

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

Update
Si trabaja con SQL Server, no olvide que no acepta por defecto(DateTime) lo que es 1/1/0001. La fecha y hora mínima de SQL Server es 1/1/1753 (explicación ). DateTime2 de SQL acepta 1/1/0001, sin embargo.

 24
Author: user1467978,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:41

Modificaría ligeramente la solución de LukeH como:

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

Que es más corto y más legible, parece.

 22
Author: Alexey Khoroshikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-25 08:15:50

No utilice un parámetro opcional:

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
Author: munificent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 04:52:11

.NET 4.0 tiene parámetros opcionales. (google es también tu amigo , aquí.)

EDITAR (debido a Anthony Pegram correcto, comentario)...

Y sí, así es como lo harías.

Pero DateTime.Ahora (propiedad estática, en esa clase) no se conoce hasta tiempo de ejecución. Como tal, no puede usar eso como un valor opcional .

. NET 3.5 no lo hace... entonces tendrías que hacer lo que JS Bangs manifestó...

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

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

O incluso el parámetro null checking/null value de la respuesta de munificent.

[2] Salud Anthony.
 4
Author: Pure.Krome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 05:07:40

C# no tiene parámetros opcionales en este sentido. Si desea que addedOn sea opcional, debe escribir una sobrecarga que no requiera ese parámetro y pasar DateTime.Now a la versión de dos argumentos.

 2
Author: JSBձոգչ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-13 04:50:41