Saya melihat konstruksi di mana-mana seperti:
int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
Mengapa tidak menggunakan:
string test = myVar.ToString();
Bukankah itu persis sama? Setidaknya Reflector mengatakan bahwa:
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
Jadi, apakah itu benar (versi yang lebih pendek) atau apakah saya kehilangan sesuatu?
Jawaban:
Anda benar sekali. Juga dalam pertanyaan ini , solusi pertama disarankan sementara tidak ada yang benar-benar memperhatikan
ToString()
sudah memberikan jawaban yang benar.Mungkin argumen untuk solusi yang lebih verbose adalah pembacaan: Ketika Anda menelepon
ToString()
pada sesuatu yang seharusnya menjadinull
, Anda biasanya mengharapkan sebuahNullReferenceException
, walaupun di sini tidak dibuang.sumber
ToString()
berhasil tanpaNullReferenceException
dilemparkan..HasValue
masih berharap untuk membuang pengecualian itu.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
mana Anda memerlukan objek yang terbuka untuk mengaksesToString
metode yang diinginkan . Tentu saja, ada solusi yang lebih ringkas untuk itu juga:$"{myNullableDateTime:d}"
Saya pikir banyak orang memiliki pemeriksaan seperti itu karena itu bukan perilaku alami dari suatu objek yang dapat memiliki nilai nol.
sumber
Tidak, Anda benar, versi yang lebih pendek sama dengan apa yang dilakukan orang lain dalam hal itu. Konstruk lain yang cenderung saya gunakan banyak daripada terner dengan nullables adalah operator penggabungan nol. yang juga melindungi Anda dari nol. Untuk ToString () itu tidak perlu (seperti yang Anda tunjukkan) tetapi untuk nilai int default (misalnya) itu berfungsi dengan baik, misalnya:
yang memungkinkan Anda melakukan semua operasi bilangan bulat di halaman tanpa pertama-tama secara eksplisit membatalkan dan memanggil nilai dalam currentPage (di mana currentPage adalah int? mungkin disahkan sebagai param)
sumber
Saya tahu, lama setelah itu relevan, tapi ... Saya curiga itu karena untuk jenis nullable seperti int? metode .ToString () tidak memungkinkan Anda untuk menggunakan format string. Lihat Bagaimana saya bisa memformat DateTime yang dapat dibatalkan dengan ToString ()? . Mungkin dalam kode asli, ada format string dalam. ToString (), atau mungkin kode lupa .ToString () tanpa format string masih tersedia pada tipe nullable.
sumber
mungkin itu hanya mengikuti pola? atau mereka tidak tahu backend. kode Anda benar persis sama. Anda bahkan dapat melakukannya:
sumber
int?
adalah sintaksis gula yang menyederhanakan deklarasi variabel nullable. Itu sama denganNullable<int>
.Jadi jika Anda melihat implementasi
ToString()
metode untukNullable<T>
(lihat di bawah) , Anda dapat melihat, bahwa ia mengembalikan string kosong jika tidak memiliki nilai.Apa yang dikatakan MSDN:
Jadi kode berikut akan mencetak string kosong ke konsol alih-alih melempar
ArgumentNullException
pengecualian.sumber