2011-10-20 9 views
22

Normalmente, si tengo un tipo anulable para un parámetro opcional, pondría nulo como el valor predeterminado. De esta forma sé que si el valor es nulo, la persona que llama no quiere especificar ningún valor para ese.¿Cuál debería ser el valor predeterminado en un parámetro opcional DateTime?

public void Foo(string text, string text2= null); 

Si el parámetro es normalmente un número entero positivo, puedo usar un número negativo

public void Foo(string text, int index=-1); 

¿Qué hay de DateTime? No es nulable, y (hasta donde yo sé) no tiene un número sin sentido que tampoco puede ser una entrada verdadera (como -1 para entero positivo). ¿O está ahí? ¿Qué usarías en esta situación?

También sé que puedo usar el tipo de nula DateTime, pero esto significa que la persona que realiza el método tendrá que usar Nullable y se opondrá a pasar convenientemente un DateTime.

+0

posible duplicado de [C# 4.0: ¿Puedo usar un TimeSpan como un parámetro opcional con un valor predeterminado?] (Http://stackoverflow.com/questions/2168798/c-sharp-4-0-can-i- use-a-timespan-as-an-optional-parameter-with-a-default-value) – nawfal

Respuesta

31

Puede tomar los tipos de valor que aceptan valores NULL usando el operador ? en C#:

DateTime? myDate = null;

A partir de este, puede hacer que el parámetro opcional:

void Foo(DateTime? myDate = null) 
{ 
} 

Further reading on Nullable Types.

Este es no es la única manera de desollar al gato, sin embargo, puedes usar default(DateTime), sin embargo yo u no se puede usar DateTime.MinValue, MaxValue, o Now en parámetros opcionales porque no son constantes de tiempo de compilación.

Por supuesto, no necesita utilizar parámetros opcionales, puede utilizar métodos sobrecargados si desea utilizar Min, Max o Now.

void Foo() 
{ 
    Foo(DateTime.MinValue); 
} 

void Foo(DateTime d) 
{ 
} 

Si quieres ir exageración (bueno, tal vez no una exageración, un montón de razones válidas para hacerlo), entonces se podría definir un nuevo tipo de fecha que se entiende cuando se tiene un valor de:

class SmarterDateTime 
{ 
    public bool IsSet { get; set; } 

    // Wrapper around DateTime etc excluded. 
} 

En cuanto a lo que debería ser el predeterminado, puede optar por hacer que cualquier fecha represente un valor predeterminado si lo desea, pero para cosas como los parámetros opcionales tendrá limitaciones.

Personalmente, tiendo a usar DateTime.MinValue.

+0

Lo sé, pero esto es un poco indeseable, porque el código de la persona que llama tendrá que llamarlo también con un nulable –

+1

@LouisRhys : No explícitamente no lo harán - hay una conversión implícita de 'DateTime' a' DateTime? '. –

+0

@JonSkeet @adam está allí? Pero aun así, recuerdo que a veces encuentro situaciones en las que espero que el código funcione con un 'DateTime' pero que no funciona con' DateTime? '(Aunque no estoy seguro de cuál era el código) –

1
// This is the best way to null out the DateTime. 
    // 
    DateTime dateTime2 = DateTime.MinValue; 
+3

Eso no "anula" un DateTime. Aún es un valor válido. ¿Cómo distinguirías entre * deliberadamente * especificando ese valor, y uno que está "ausente"? –

13

defecto (DateTime) - por defecto el operador le está destinado,

+1

¿cuál es el valor real de la misma? –

+2

Para cualquier otra persona que se lo pregunte, el valor real es: '1-1-0001 0: 00: 00' – natli

+0

Es equivalente a' DateTime.MinValue' (Medianoche del primer día del primer mes del primer año). – Kjartan

3

Si utiliza el anulables los llamadores de su función solo puede pasar un DateTime regular a ella, por lo que no se dará cuenta de una cosa:) Hay operadores implícitos que lo hará por usted

Si desea establecer un defecto en la función que puede hacer:

public void Foo(DateTime? value = null) 
{ 
    if (value == null) 
    { 
     value = ... // default 
    } 
} 
4

cheque el parámetro predeterminado fecha y hora, se valor de s sería 1/1/0001 12:00:00 AM,

private void M(Int32 x = 9, String s = “A”, DateTimedt = default(DateTime), Guidguid = new Guid()) { 
Console.WriteLine(“x={0}, s={1}, dt={2}, guid={3}”, x, s, dt, guid); 
} 
1

Le recomendamos que utilice el valor y el uso DateTime.MinValue sobrecarga.

6

En la pregunta "¿cuál puede ser un valor predeterminado para un DateTime" la respuesta debe ser: solo puede usar default(DateTime). Esto debido a que el valor por defecto debe ser const y ambos DateTime.MinValue y DateTime.MaxValue única static readonly son, pero tenga en cuenta que

default(DateTime) == DateTime.MinValue 

hasta el Kind.

Si lo desea, puede implementar una sobrecarga con un parámetro menos (el DateTime) y desde esa sobrecarga llamar al método "principal" que pase el valor que prefiera.

Pero según lo escrito por otros, el problema es que usted escribió premisas equivocadas.

No, DateTime (como casi todos los ValueType s. Casi todo porque Nullable<Nullable<int>> es ilegal, incluso mientras Nullable<T> es una ValueType) es anulable. Nullable<DateTime> o DateTime? (lo mismo)

Incluso int pueden contener nulos, ¿sabes? int? :-)

2

Fragmento de código comunicado

public DateTime method1() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return default(DateTime); 

} 

El valor por defecto será inicializar un tipo de valor a su valor por defecto. En el caso de una fecha y hora este valor también se expone como una propiedad estática llamada DateTime.MinValue. Si usa C# 1.0, la declaración "default (DateTime)" sería equivalente a "DateTime.MinValue". Puede usar este valor especial como un tipo de valor de "marcador", lo que significa que si se devuelve indica una fecha de tiempo no válida.

Si usando C# 2.0 nuevo, también es posible utilizar lo que se llama un tipo anulable, y en realidad devuelve NULL, como se muestra en el siguiente ejemplo

Fragmento de código

public DateTime? method2() 
{ 

    if (condition) 

    return new DateTime(2007, 5, 30, 11, 32, 00); 

    else 

    return null; 

} 
+0

Al usar MVC, tenía un DateTime como opcional, pero la función a la que llamaba para intentar convertirla a una fecha y hora no funcionaría. Agregar el? al tipo de devolución de función lo arregló por completo .. ¡GRACIAS! –

5

DateTime.MinValue habrá el valor predeterminado.

0

Depende de su caso de uso.

Cualquiera que no concuerde con los datos reales funcionará, pero eso depende del uso que usted haga de él (de modo que lo hace -1 para enteros, ya que es un entero perfectamente bueno solo para su uso siendo uno solo los enteros positivos tienen sentido).

Si está enviando una fecha mínima (interesados ​​en todos los foo que sean posteriores), cualquier fecha anterior a la primera fecha razonable funcionará, y el código .Where(f -> f.When > myDate) funcionará sin tener que buscar ese caso especial.

Del mismo modo, con las fechas máximas en reversa (cualquier fecha posterior a la última fecha sensible).

De lo contrario, solo evite el uso de los valores predeterminados por completo, y la sobrecarga en su lugar.

+0

por "sobrecarga en su lugar" ¿quiere decir repetir el cuerpo del método en ambos métodos? –

+0

Idealmente, tanto lo que sea posible se compartiría entre uno que llama al otro, o llamando a un método privado con la mayor parte del código. Justo donde se encuentra el equilibrio depende de lo que está haciendo en dichos métodos. –

+0

Sí, estoy de acuerdo, pero si uno llama al otro o ambos llaman al mismo método, todavía tenemos que resolver el problema original, ¿no? –

Cuestiones relacionadas