SORU
15 EYLÜL 2008, PAZARTESİ


C genel bağımsız değişken Null veya varsayılan karşılaştırma#

Genel bir yöntem bu şekilde tanımlıyorum:

public void MyMethod<T>(T myArgument)

Yapmak istediğim ilk şey, eğer myArgument değeri türü için varsayılan değer olup olmadığını kontrol etmek, böyle bir şey:

if (myArgument == default(T))

Ama bu T == operatörü uygulayacak garantili almadım çünkü derleme değildir. Bu kodu değiştirdim:

if (myArgument.Equals(default(T)))

Şimdi bu derler, ama eğer myArgument için test ediyorum bir parçası olan null, başarısız olur. Bu gibi açık boş bir onay ekleyebilirsiniz:

if (myArgument == null || myArgument.Equals(default(T)))

Şimdi bu bana gereksizmiş gibi geldi. ReSharper bile myArgument değiştireyim = = = = varsayılan(T) başladığım yere içine myArgument kısmı boş iddia etmiyoruz. Daha iyi bir şekilde bu sorunu çözmek için vardır?

EDİT: desteğe ihtiyacım varher ikisi debaşvurular türleri ve değer türleri.

CEVAP
14 Mayıs 2009, PERŞEMBE


Boks önlemek için, eşitlik için jenerik karşılaştırmak için en iyi yolu EqualityComparer<T>.Default ile. Bu* *10 (boks olmadan) yanı sıra object.Equals, saygı ve tüm Nullable<T> "" nüanslar. kaldırdı kolları Bu nedenle:

if(EqualityComparer<T>.Default.Equals(obj, default(T))) {
    return obj;
}

Bu maç olacak:

  • sınıflar boş
  • (boş) Nullable<T> null
  • diğer yapılar için/etc/yanlış sıfır

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • girleffect

    girleffect

    20 Mayıs 2008
  • Shon Gonzales

    Shon Gonzale

    5 EKİM 2014