it-swarm-id.com

Apa yang seharusnya menjadi nilai default dalam parameter opsional DateTime?

Biasanya, jika saya memiliki tipe nullable untuk parameter opsional, saya akan meletakkan null sebagai nilai default. Dengan cara ini saya tahu bahwa jika nilainya nol, penelepon tidak ingin menentukan nilai apa pun untuk yang itu. 

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

Jika parameter normalnya adalah bilangan bulat positif, saya bisa menggunakan angka negatif

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

Bagaimana dengan DateTime? Ini tidak dapat dibatalkan, dan (sejauh yang saya tahu) tidak memiliki angka yang tidak berarti yang tidak dapat menjadi input yang benar juga (seperti -1 untuk bilangan bulat positif). Atau ada? Apa yang akan Anda gunakan dalam situasi ini?

Saya juga tahu bahwa saya dapat menggunakan jenis DateTime yang dapat dibatalkan, tetapi ini berarti bahwa pemanggil metode harus menggunakan Nullable serta menentang untuk dengan mudah melewati DateTime.

24
Louis Rhys

Anda dapat membuat tipe nilai nullable menggunakan operator ? di C #:

DateTime? myDate = null;

Dari ini, Anda dapat membuat parameter opsional:

void Foo(DateTime? myDate = null)
{
}

Bacaan lebih lanjut tentang Jenis Nullable.

Namun ini bukan satu-satunya cara untuk menguliti kucing, Anda dapat menggunakan default(DateTime), namun Anda tidak dapat menggunakan DateTime.MinValue, MaxValue, atau Now dalam parameter opsional karena mereka tidak menyusun konstanta waktu.

Tentu saja, Anda tidak perlu menggunakan parameter opsional, Anda dapat menggunakan metode kelebihan beban jika Anda ingin menggunakan Min, Max, atau Sekarang.

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

void Foo(DateTime d)
{
}

Jika Anda ingin berlebihan (yah, mungkin tidak berlebihan, banyak alasan yang sah untuk melakukan ini), maka Anda dapat menentukan tipe tanggal baru yang memahami kapan nilai tersebut:

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

    // Wrapper around DateTime etc excluded.
}

Mengenai apa yang seharusnya menjadi default, Anda dapat memilih untuk membuat tanggal apa pun mewakili default jika Anda inginkan, tetapi untuk hal-hal seperti parameter opsional Anda akan memiliki batasan.

Secara pribadi, saya cenderung menggunakan DateTime.MinValue.

32
Adam Houldsworth

default (DateTime) - standar operator dimaksudkan untuk Ini

15
Vasya

Pada pertanyaan "apa yang bisa menjadi nilai default untuk DateTime" jawabannya harus: Anda hanya dapat menggunakan default(DateTime). Ini karena nilai default harus const dan DateTime.MinValue dan DateTime.MaxValue hanya static readonly, tetapi perhatikan bahwa

default(DateTime) == DateTime.MinValue

ke Kind.

Jika mau, Anda dapat menerapkan overload dengan satu parameter lebih sedikit (DateTime) dan dari overload itu panggil metode "utama" yang meneruskan nilai yang Anda inginkan.

Namun seperti yang ditulis oleh orang lain, masalahnya adalah Anda salah menuliskan premis.

Tidak, DateTime (karena hampir semua ValueTypes. Hampir semuanya karena Nullable<Nullable<int>> adalah ilegal, meskipun Nullable<T> adalah ValueType) tidak dapat dibatalkan . Nullable<DateTime> atau DateTime? (hal yang sama)

Bahkan int dapat dibatalkan, Anda tahu? int? :-)

6
xanatos

DateTime.MinValue akan menjadi nilai default.

5
hungryMind

periksa parameter default dateTime, nilainya akan menjadi 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);
}
4
Boomer

Jika Anda menggunakan Nullable, penelepon fungsi Anda hanya dapat melewatkan DateTime biasa untuk itu, sehingga mereka tidak akan melihat apa-apa :) Ada operator implisit yang akan melakukan ini untuk Anda

Jika Anda ingin menetapkan default pada fungsi Anda, Anda dapat melakukannya:

public void Foo(DateTime? value = null)
{
    if ( value == null )
    {
        value = ... // default
    } 
}
3
Wouter de Kort

Cuplikan Kode

public DateTime method1()
{

  if (condition)

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

  else

    return default(DateTime);

}

Pernyataan default akan menginisialisasi tipe nilai ke nilai standarnya. Dalam kasus datetime, nilai ini juga diekspos sebagai properti statis yang disebut DateTime.MinValue. Jika menggunakan C # 1.0 pernyataan "default (DateTime)" akan setara dengan "DateTime.MinValue". Anda dapat menggunakan nilai khusus ini sebagai semacam nilai "penanda", yang berarti jika dikembalikan, ini menunjukkan waktu yang tidak valid.

Jika menggunakan C # 2.0 lagi, juga dimungkinkan untuk menggunakan apa yang disebut tipe nullable, dan benar-benar mengembalikan NULL, seperti yang ditunjukkan pada contoh berikut

Cuplikan Kode

public DateTime? method2()
{

  if (condition)

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

  else

    return null;

}
    // This is the best way to null out the DateTime.
    //
    DateTime dateTime2 = DateTime.MinValue;
1
Pranay Rana

Anda mungkin mempertimbangkan untuk menggunakan nilai DateTime.MinValue dan menggunakan overloading. 

1
Kjartan

Tergantung pada kasus penggunaan Anda.

Apa pun yang tidak cocok dengan data nyata akan berfungsi, tetapi itu tergantung pada penggunaan Anda terhadapnya (jadi dengan cara -1 untuk bilangan bulat, karena bilangan bulat itu hanya baik untuk penggunaan Anda karena hanya satu bilangan bulat positif yang masuk akal ).

Jika Anda mengirim tanggal minimum (tertarik pada semua foo yang kemudian) maka tanggal apa pun sebelum tanggal masuk akal yang paling awal akan dilakukan, dan kode seperti .Where(f -> f.When > myDate) akan bekerja tanpa harus mencari kasing khusus.

Demikian juga dengan tanggal maksimum secara terbalik (tanggal yang akan setelah tanggal masuk akal terbaru).

Jika tidak, cukup hindari penggunaan default sepenuhnya, dan sebaliknya kelebihan beban.

0
Jon Hanna