Saya suka operator penggabungan nol karena membuatnya mudah untuk menetapkan nilai default untuk tipe nullable.
int y = x ?? -1;
Itu bagus, kecuali jika saya perlu melakukan sesuatu yang sederhana x
. Misalnya, jika saya ingin memeriksa Session
, biasanya saya harus menulis sesuatu yang lebih bertele-tele.
Saya berharap saya bisa melakukan ini:
string y = Session["key"].ToString() ?? "none";
Tetapi Anda tidak bisa karena .ToString()
dipanggil sebelum pemeriksaan null sehingga gagal jika Session["key"]
null. Saya akhirnya melakukan ini:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Ini berfungsi dan lebih baik, menurut saya, daripada alternatif tiga baris:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Meskipun itu berhasil, saya masih penasaran apakah ada cara yang lebih baik. Sepertinya tidak peduli apa yang selalu saya rujuk Session["key"]
dua kali; sekali untuk cek, dan sekali lagi untuk tugas. Ada ide?
.?
) seperti yang dimiliki Groovy .Jawaban:
Bagaimana dengan
sumber
.ToStringOrDefault()
yang saya sukai untuk melakukannya. Namun, saya menggunakan jawaban ini dalam metode ekstensi Jon;)Jika Anda sering melakukan ini secara khusus,
ToString()
Anda dapat menulis metode ekstensi:Atau metode yang mengambil default, tentu saja:
sumber
.ToStringOrDefault()
sederhana dan elegan. Solusi yang bagus.object
adalah kutukan dan membuang basis kode, dan metode ekstensi yang beroperasi tanpa kesalahan padathis
nilai nol adalah kejahatan murni.Anda juga bisa menggunakan
as
, yang menghasilkannull
jika konversi gagal:Ini akan kembali
"none"
bahkan jika seseorang boneka sebuahint
diSession["key"]
.sumber
ToString()
sejak awal.ToString()
untuk mengonversi objek yang berisi string menjadi string. Anda dapat melakukan hal yang sama denganobj as string
atau(string)obj
. Ini adalah situasi yang cukup umum di ASP.NET.ToString()
objek (yaitu,Session["key"]
) yang tipenya tidak dia sebutkan. Ini bisa berupa objek apa saja, tidak harus berupa string.Jika akan selalu menjadi
string
, Anda dapat mentransmisikan:Ini memiliki keuntungan dari mengeluh daripada menyembunyikan kesalahan jika seseorang memasukkan
int
atau sesuatuSession["key"]
. ;)sumber
Semua solusi yang disarankan bagus, dan jawab pertanyaannya; jadi ini hanya untuk memperpanjangnya sedikit. Saat ini mayoritas jawaban hanya berurusan dengan validasi null dan tipe string. Anda dapat memperluas
StateBag
objek untuk menyertakanGetValueOrDefault
metode umum , mirip dengan jawaban yang diposting oleh Jon Skeet.Metode ekstensi generik sederhana yang menerima string sebagai kunci, lalu ketik memeriksa objek sesi. Jika objek null atau bukan jenis yang sama, default dikembalikan, jika nilai sesi dikembalikan sangat diketik.
Sesuatu seperti ini
sumber
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
sesi ini. :)Kami menggunakan metode yang disebut
NullOr
.Pemakaian
Sumber
sumber
Dot
tetapi menganggapnya terlalu tidak deskriptif. Kami memutuskanNullOr
sebagai pertukaran yang baik antara penjelasan diri dan singkatnya. Jika Anda sama sekali tidak peduli dengan penamaannya, Anda selalu dapat menyebutnya_
. Jika Anda merasa lambda terlalu rumit untuk ditulis, Anda dapat menggunakan potongan untuk ini, tetapi secara pribadi saya merasa cukup mudah. Adapun? :
, Anda tidak dapat menggunakannya dengan ekspresi yang lebih kompleks, Anda harus memindahkannya ke lokal baru;NullOr
memungkinkan Anda untuk menghindari itu.Preferensi saya, untuk yang satu ini, akan menggunakan cast yang aman ke string jika objek yang disimpan dengan kunci bukan satu. Menggunakan
ToString()
mungkin tidak memberikan hasil yang Anda inginkan.Seperti yang dikatakan @Jon Skeet, jika Anda sering melakukan ini sebagai metode ekstensi atau, lebih baik, namun mungkin metode ekstensi dalam hubungannya dengan kelas SessionWrapper yang diketik dengan kuat. Bahkan tanpa metode ekstensi, pembungkus yang diketik dengan kuat mungkin merupakan ide yang bagus.
Digunakan sebagai
sumber
membuat fungsi tambahan
sumber
Jawaban Skeet adalah yang terbaik - khususnya menurut saya jawabannya
ToStringOrNull()
cukup elegan dan paling sesuai dengan kebutuhan Anda. Saya ingin menambahkan satu opsi lagi ke daftar metode ekstensi:Kembalikan objek asli atau nilai string default untuk null :
Gunakan
var
untuk nilai yang dikembalikan karena akan kembali sebagai tipe masukan asli, hanya sebagai string default ketikanull
sumber
null
defaultValue
jika tidak diperlukan (yaituinput != null
)?input != null
eval akan kembali objek sebagai sendiri.input == null
mengembalikan string yang disediakan sebagai param. oleh karena itu ada kemungkinan seseorang dapat memanggil.OnNullAsString(null)
- tetapi tujuannya (meskipun metode ekstensi jarang berguna) adalah untuk memastikan Anda mendapatkan objek kembali atau string default ... tidak pernah nullinput!=null
Skenario hanya akan kembali masukan jikadefaultValue!=null
juga memegang; jika tidak maka akan melemparArgumentNullException
.Ini adalah "operator Elvis" tipe kecil saya yang aman untuk versi .NET yang tidak mendukung?.
Argumen pertama adalah objek yang diuji. Kedua adalah fungsinya. Dan ketiga adalah nilai nol. Jadi untuk kasus Anda:
Ini juga sangat berguna untuk tipe nullable. Sebagai contoh:
sumber