Jawaban di bawah ini ditulis bertahun-tahun yang lalu dan diperbarui seiring waktu. Pada C # 7, Anda dapat menggunakan pencocokan pola:
if (animal is Dog dog)
{
// Use dog here
}
Catatan yang dog
masih dalam cakupan setelah if
pernyataan, tetapi tidak ditetapkan secara pasti.
Tidak, tidak ada. Akan lebih idiomatis untuk menulis ini:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
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:
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
Itu hanya jahat ... (Saya baru saja mencobanya, dan itu berhasil. Tapi tolong, tolong jangan lakukan ini. Oh, dan Anda dapat mendeklarasikan dog
menggunakan var
tentu saja.)
Tentu saja Anda dapat menulis metode ekstensi:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
Kemudian sebut dengan:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
Atau, Anda dapat menggabungkan keduanya:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
// EVIL EVIL EVIL
for (var t = value as T; t != null; t = null)
{
action(t);
}
}
Anda juga dapat menggunakan metode ekstensi tanpa ekspresi lambda dengan cara yang lebih bersih daripada for loop:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
Kemudian:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
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 dalam while
meskipun ketika membaca aliran data. Sebagai contoh:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
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.
bool
kondisinya?