Neden türün kendisi yerine tür kısıtlaması olan genel bir yöntem kullanmalıyım?


14

Farklı bir StackExchange soruda, bu prototip kullanan birini fark ettim:

void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
    //Code....
}

Sadece tek bir tip kısıtlaması ( SomeSpecificReferenceType) vardır, sadece bunun gibi yazmanın farkı ve avantajı nedir:

void DoSomething(SomeSpecificReferenceType arg)
{
    //Code....
}

Her iki durumda da, argderleme zamanı tip kontrolüne tabi olacaktır. Her iki durumda da, yöntemin gövdesi arg, derleme zamanında bilinen belirli bir tür olan (veya soyundan gelen) bilgiye güvenebilir .

Bu, sıradan kalıtım hakkında bilgi edinmeden önce jenerikleri öğrenen aşırı hevesli bir geliştirici vakası mıdır? Yoksa bir yöntem imzasının bu şekilde yazılmasının meşru bir nedeni var mı?


Ancak bu sadece bir tahmin, ancak C # biliyorum, ancak bu dinamik gönderme yerine daha verimli statik dağıtım etkinleştirmez mi?
Anton Barkovsky

Yanıtlar:


13

Bu, sıradan kalıtım hakkında bilgi edinmeden önce jenerikleri öğrenen aşırı hevesli bir geliştirici vakası mıdır?

Evet, muhtemelen öyle.

Yoksa bir yöntem imzasının bu şekilde yazılmasının meşru bir nedeni var mı?

Belki . Genel olarak, ilgili bir dönüş değeri Tveya kullanılan başka bir parametre olması daha anlamlı olur T.

Ancak, kodun iç kısımlarının T(belki de bir serileştiriciye argüman olarak?) Kullanması ve kısıtlama sınıfını değil, özel olarak kullanılması gerekirT . Kısıtlama, kısıtlama ile eşleştirilmiş bir arayüz olduğunda newve yöntemin bağırsaklarının Tbir nedenle s oluşturduğunu göreceksiniz .

Bu nedenle, gerekli kısıtlama sürümünü görmek nadir olmakla birlikte, zaman zaman vardır. Ve bu yöntem her zaman mümkündür kullanılan ihtiyaç için, ama şimdi değil ve geliştirici o kadar bir kırılma değişiklik tanıtmak getirmemektir bıraktı.


1

Sanırım bunu içeren bir cevap yazdığımı hatırlıyorum.

O zaman neden şöyleydi:
(Kod farklı olabilir. Sadece genel bir yöntemde type parametresinde bir kısıtlamanın olası nedenlerinden birini göstermek için.)

class SomeSingleton
{
    static Dictionary<Type, List<object>> staticTypeSpecificList;
    public void AddObjectToList<T>(T t) where T : SomeCommonThing
    {
        Type tt = t.GetType();
        List<object> list;
        if (!staticTypeSpecificList.TryGet(tt, out list))
        {
            list = new List<object>();
            staticTypeSpecificList.Add(tt, list);
        }
        list.Add(t);
    }
}

Temel olarak, kod manuel olarak kodlama tipi manipülasyonlarının içine girer. Ayrıca bazı yansımalarla karıştırılabilir.

Örneğin, kullanılarak Method<T>(T arg) where T : ..., tek bir yerine arg.GetType()ile typeof(T). Yine de, bu seçimin iyi mi kötü mü olduğunu bilmiyorum.

Sanırım bu sadece yazarın (muhtemelen ben ya da başka biri) tüm kodlama olasılıklarını dikkatle düşünmeyen bir örnek , aynı zamanda farklı bir soru / konuya çok fazla odaklanıyor.


msgstr "arg.GetType () yerine typeof (T) kullanılabilir". Bu, arg geçerli olarak null olduğunda faydalıdır, örn. Bazı serileştirme durumlarında.
17'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.