Saya punya kelas Animal
, dan subkelasnya Dog
. Saya sering menemukan diri saya mengkodekan baris berikut:
if (animal is Dog)
{
Dog dog = animal as Dog;
dog.Name;
...
}
Untuk variabel Animal animal;
.
Apakah ada beberapa sintaks yang memungkinkan saya untuk menulis sesuatu seperti:
if (Dog dog = animal as Dog)
{
dog.Name;
...
}
c#
casting
if-statement
michael
sumber
sumber
bool
kondisinya?null
=false
Dalam C #; C # hanya memungkinkan bools aktual atau hal-hal yang secara implisit dapat dikonversi menjadi bools dalamif
kondisi. Tidak ada nulls atau pun dari tipe integer yang secara implisit dapat dikonversi menjadi bools.Jawaban:
Jawaban di bawah ini ditulis bertahun-tahun yang lalu dan diperbarui seiring waktu. Pada C # 7, Anda dapat menggunakan pencocokan pola:
Catatan yang
dog
masih dalam cakupan setelahif
pernyataan, tetapi tidak ditetapkan secara pasti.Tidak, tidak ada. Akan lebih idiomatis untuk menulis ini:
Mengingat bahwa "sebagaimana diikuti oleh jika" hampir selalu digunakan dengan cara ini, mungkin lebih masuk akal jika ada operator yang melakukan kedua bagian sekaligus. Ini saat ini tidak dalam C # 6, tetapi mungkin menjadi bagian dari C # 7, jika proposal pencocokan pola diterapkan.
Masalahnya adalah Anda tidak dapat mendeklarasikan variabel di bagian kondisi
if
pernyataan 1 . Pendekatan terdekat yang dapat saya pikirkan adalah ini:Itu hanya jahat ... (Saya baru saja mencobanya, dan itu berhasil. Tapi tolong, tolong jangan lakukan ini. Oh, dan Anda dapat mendeklarasikan
dog
menggunakanvar
tentu saja.)Tentu saja Anda dapat menulis metode ekstensi:
Kemudian sebut dengan:
Atau, Anda dapat menggabungkan keduanya:
Anda juga dapat menggunakan metode ekstensi tanpa ekspresi lambda dengan cara yang lebih bersih daripada for loop:
Kemudian:
1 Anda dapat menetapkan nilai dalam
if
pernyataan, meskipun saya jarang melakukannya. Itu tidak sama dengan mendeklarasikan variabel. Ini tidak terlalu biasa bagi saya untuk melakukannya dalamwhile
meskipun ketika membaca aliran data. Sebagai contoh:Hari-hari ini saya biasanya lebih suka menggunakan pembungkus yang memungkinkan saya menggunakan
foreach (string line in ...)
tetapi saya melihat di atas sebagai pola yang cukup idiomatis. Ini biasanya tidak baik untuk memiliki efek samping dalam kondisi, tetapi alternatif biasanya melibatkan duplikasi kode, dan ketika Anda tahu pola ini sangat mudah untuk mendapatkan hak.sumber
EVIL EVIL EVIL
, tapi saya tidak positif.AsEither(...)
, saya pikir itu sedikit lebih jelas daripadaAsIf(...)
, jadi saya bisa menulismyAnimal.AsEither(dog => dog.Woof(), cat => cat.Meeow(), unicorn => unicorn.ShitRainbows())
.Jika
as
gagal, ia kembalinull
.sumber
if
pernyataan dan bukan dalam lingkup luar.if
dapat memiliki hasil bool dan tugas.Dog dog; if ((dog = animal as Dog) != null) { // Use Dog }
tetapi itu masih memperkenalkan variabel dalam lingkup luar.Anda dapat menetapkan nilai ke variabel, selama variabel sudah ada. Anda juga bisa membuat ruang lingkup variabel untuk memungkinkan nama variabel untuk digunakan lagi nanti dalam metode yang sama, jika itu masalah.
asumsi
mendapat hasil:
Pola penetapan variabel dalam tes ini juga digunakan ketika membaca blok byte dari stream, misalnya:
Namun, pola pelingkupan variabel yang digunakan di atas bukan pola kode yang umum dan jika saya melihatnya digunakan di semua tempat, saya akan mencari cara untuk memperbaikinya.
sumber
Kemungkinan akan ada di C # 6.0. Fitur ini disebut "pernyataan deklarasi". Lihat
https://roslyn.codeplex.com/discussions/565640
untuk detail.
Sintaks yang diusulkan adalah:
Secara umum, fitur yang diusulkan adalah bahwa deklarasi variabel lokal dapat digunakan sebagai ekspresi . Ini
if
sintaks adalah hanya konsekuensi bagus dari fitur yang lebih umum.sumber
Try*
(misalnya,TryParse
). Fitur ini tidak hanya membuat panggilan seperti itu menjadi satu ekspresi (sebagaimana mestinya, IMO), tetapi juga memungkinkan pelingkupan yang lebih bersih dari variabel-variabel tersebut. Saya sangat antusias tentang memilikiout
parameterTry
metode scoping untuk yang bersyarat; ini membuatnya lebih sulit untuk memperkenalkan jenis bug tertentu.Salah satu metode ekstensi yang sering saya gunakan untuk menulis dan menggunakan * adalah
Yang dapat digunakan dalam situasi ini sebagai
Dan kemudian
name
adalah nama anjing (jika itu adalah anjing), jika tidak, null.* Saya tidak tahu apakah ini pemain. Itu tidak pernah muncul sebagai hambatan dalam profil.
sumber
Melawan biji-bijian di sini, tapi mungkin Anda salah melakukannya sejak awal. Memeriksa jenis objek hampir selalu merupakan bau kode. Tidak semua Hewan, dalam contoh Anda, memiliki Nama? Kemudian panggil saja Animal.name, tanpa memeriksa apakah itu anjing atau bukan.
Atau, balikkan metode sehingga Anda memanggil metode pada Hewan yang melakukan sesuatu yang berbeda tergantung pada jenis beton Hewan. Lihat juga: Polimorfisme.
sumber
Pernyataan Lebih Pendek
sumber
Berikut adalah beberapa kode kotor tambahan (tidak seburuk yang dimiliki Jon, tetapi :-)) tergantung pada modifikasi kelas dasar. Saya pikir itu menangkap maksud sementara mungkin melewatkan intinya:
sumber
Jika Anda harus melakukan banyak seperti-jika satu demi satu (dan menggunakan polimorfisme bukan pilihan), pertimbangkan untuk menggunakan konstruk SwitchOnType .
sumber
Masalahnya (dengan sintaks) bukan dengan penugasan, karena operator penugasan dalam C # adalah ekspresi yang valid. Melainkan, dengan deklarasi yang diinginkan karena deklarasi adalah pernyataan.
Jika saya harus menulis kode seperti itu, kadang-kadang saya akan (tergantung pada konteks yang lebih besar) menulis kode seperti ini:
Ada kelebihan dengan sintaks di atas (yang dekat dengan sintaks yang diminta) karena:
dog
luar yangif
akan menghasilkan error kompilasi karena tidak ditugaskan nilai di tempat lain. (Yaitu, jangan ditugaskan didog
tempat lain.)if/else if/...
(Hanya ada sebanyak yangas
diperlukan untuk memilih cabang yang sesuai; ini kasus besar di mana saya menulisnya dalam bentuk ini ketika saya harus.)is/as
. (Tetapi juga dilakukan denganDog dog = ...
bentuk.)Untuk benar-benar mengisolasi
dog
dari seluruh dunia, sebuah blok baru dapat digunakan:Selamat coding.
sumber
Anda bisa menggunakan sesuatu seperti itu
// Nyatakan variabel bool temp = false;
sumber
Solusi EVIL lain dengan metode ekstensi :)
Saya pribadi lebih suka cara bersih:
sumber
Pernyataan if tidak akan mengizinkan itu, tetapi sebuah for loop akan melakukannya.
misalnya
Dalam hal cara kerjanya tidak segera jelas maka di sini adalah langkah demi langkah penjelasan proses:
iterasi.
sumber
sumber
IDK jika ini membantu siapa saja tetapi Anda selalu dapat mencoba menggunakan TryParse untuk menetapkan variabel Anda. Berikut ini sebuah contoh:
The Total variabel akan dideklarasikan sebelum pernyataan Anda jika.
sumber
Saya baru saja menggarisbawahi pernyataan if untuk membuat garis kode yang terlihat seperti apa yang Anda minati. Itu hanya membantu memampatkan kode beberapa dan saya menemukan itu lebih mudah dibaca terutama ketika tugas peneluran:
sumber
Saya tahu saya sangat terlambat terlambat ke pesta, tapi saya pikir saya akan memposting solusi saya sendiri untuk dilema ini karena saya belum melihatnya di sini (atau di mana pun dalam hal ini).
Dengan ini, Anda dapat melakukan hal-hal seperti:
CATATAN PENTING: Jika Anda ingin menggunakan TryA () menggunakan Interface, Anda HARUS memiliki antarmuka mewarisi IAble.
Nikmati! 🙂
sumber