SORU
18 AĞUSTOS 2011, PERŞEMBE


# - C, bir if ifadesi içinde Atama

Sınıf* *10 ve alt sınıf Dogvar. Ben genellikle aşağıdaki satırları kendim kodlama:

if (animal is Dog)
{
    Dog dog = animal as Dog;    
    dog.Name;    
    ... 
}

Değişken Animal animal;.

Var benim gibi bir şey yazmak için bazı sözdizimi:

if (Dog dog = animal as Dog)
{    
    dog.Name;    
    ... 
}

CEVAP
18 AĞUSTOS 2011, PERŞEMBE


Hayır, yok. Daha deyimsel bu olsa yazmak için:

Dog dog = animal as Dog;
if (dog != null)
{
    // Use dog
}

"Neredeyse." olarak gerektiğidir ^em>her zamanbu şekilde kullanıldığında, tek seferde iki parça gerçekleştiren bir operatör olması daha mantıklı olabilir. Bu şu anda C değil# 6, ama C# 7, pattern matching proposal uygulanan bir parçası olabilir.

Sorun değililanif deyimi durumda değişken bir parçası1. Aklıma en yakın yaklaşım bu

// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
    ...
}

Sadeceiğrenç... (Sadece ben denedim ve işe yarıyor. Ama lütfen, lütfen bunu yapma. Oh, ve dog elbette var kullanarak bildirebilirsiniz.)

Tabii bir uzantısı 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);
    }
}

O zaman arayın:

animal.AsIf<Dog>(dog => {
    // Use dog in here
});

Alternatif olarak, iki birleştirmek olabilir:

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 döngü için daha temiz bir şekilde lambda ifadesi olmadan bir uzantısı 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
}

1Yapabilirsinizatayınif değerleri açıklamaları, nadiren çok olsa da. Ama değişkenleri bildirme aynı şey değil. Değilçokbana veri akışı okurken while bunu yapmak için alışılmadık bir durum. Örneğin:

string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}

Bu gün ben normalde bana foreach (string line in ...) kullanım sağlayan bir kapsayıcı kullanmak için tercih ederim ama çok deyimsel bir kalıp olarak yukarıda görüntüleyin.genelliklebir koşul içinde yan etkisi olmaması güzel, ama alternatifler genellikle kod çoğaltılması dahil, ve bu desen bildiğin zaman kolay değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3dmmfavs

    3dmmfavs

    29 Kasım 2009
  • Caina Mondo Zine

    Caina Mondo

    13 EKİM 2007
  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011