Aşağıdaki cevap yıllar önce yazılmış ve zaman içinde güncellenmiştir. C # 7'den itibaren, desen eşleştirmeyi kullanabilirsiniz:
if (animal is Dog dog)
{
// Use dog here
}
dog
İfadeden sonra hala kapsamda olduğunu if
, ancak kesinlikle atanmadığını unutmayın.
Hayır, yok. Yine de bunu yazmak daha deyimsel:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
Hemen hemen her zaman bu şekilde kullanıldığı takdirde, "ardından gelen" ifadesi göz önüne alındığında, her iki parçayı tek seferde gerçekleştiren bir operatör olması daha mantıklı olabilir. Bu şu anda C # 6'da değil, ancak desen eşleştirme teklifi uygulanmışsa C # 7'nin bir parçası olabilir .
Sorun, 1 ifadesinin koşul bölümünde bir değişkeni bildirememenizdir . Aklıma gelen en yakın yaklaşım şudur:if
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
Bu sadece kötü ... (Sadece denedim ve işe yarıyor. Ama lütfen, lütfen bunu yapma. Oh, ve elbette dog
kullanarak beyan edebilirsin var
.)
Tabii ki bir uzantı yöntemi yazabilirsiniz:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
Sonra şununla ara:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
Alternatif olarak, ikisini birleştirebilirsiniz:
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);
}
}
Ayrıca, lambda ifadesi olmadan for döngüsüne göre daha temiz bir şekilde bir genişletme yöntemi kullanabilirsiniz:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
Sonra:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1 Şunları yapabilirsiniz atamak değerler if
Nadiren bunu da, ifadeleri. Bu değişkenleri bildirmekle aynı şey değildir. Veri akışlarını okurken bunu yapmak benim için çok sıradışı değil while
. Örneğin:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
Bu günlerde normalde kullanmama izin veren bir sarıcı kullanmayı tercih ediyorum foreach (string line in ...)
ama yukarıdakileri oldukça deyimsel bir desen olarak görüyorum. Bu var genellikle bir koşul içinde yan etkileri olması güzel değil ama alternatifleri genellikle kod tekrarını içerir ve bu desen bildiğinde doğru almak kolaydır.
bool
Durum ne olurdu ?