Dönüş arayüzü veya sınıf


9

Bir yöntemim olduğunu varsayalım

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

Ben bir dönüm yerine (ya IListda IEnumerable) bir arayüz dönmek daha iyi olacağını okudum List. Bunu yapmak için duyduğum bazı argümanlar, verileri gizlemesidir ve API geliştiricisine, daha sonraki bir tarihte verilerin dahili sunumunu değiştirme esnekliği kazandırır.

Sadece geri dönmekle ilgili endişem IEnumerable, rasgele erişim ve Countözellik gibi işlevselliği kaybetmenizdir .

IEnumerableBir parametrenin kabul edilmesinin mantıklı olduğunu biliyorum , çünkü tüketiciye yöntemime veri göndermek için en iyi esnekliği, yöntemin çalışması için minimalist gereksinim kümesini verir.

Dönüş türü için en iyi uygulama hangisidir?


5
Çok daha önemli: parametre tipi olarak bir arayüz alın.
Michael Borgwardt

Yanıtlar:


10

Genel olarak, arayüzlerle başlayabilir ve yalnızca ekstra yöntemleri beklenenden daha sık kullandığınızı fark ederseniz, beton türünü dönüş türü olarak taşıyabilirsiniz.

Bir arayüze dönerseniz, daha fazla esneklik elde edersiniz. Farklı bir beton türü döndürmek için uygulamayı daha sonra değiştirebilirsiniz. Öte yandan, açıkça arayana daha az bilgi verir, bu nedenle belirli işlemleri gerçekleştiremeyebilirler. (Örneğin: geri dönerseniz List<T>, arayan, yalnızca geri döndüğünüzü beyan ederseniz yapamayacağı ConvertAll vb IList<T>.

Say veya Sırala yöntemiyle ilgili olarak, bunun için standart bir toplama arabirimi yoktur. Ancak, herhangi bir IList'i sıralamak veya saymak için bir uzantı yöntemi yazabilirsiniz.


Sanırım bu gerçekten zor bir kural değil mi?
Matthew

evet, bu gerçekten kullanıma bağlıdır.
Yusubov

1

Sen sahip olmak koleksiyonunuzu gerekirse bir Countkullanabileceğiniz ICollection<T>genel yeterli olan.


-1. Kont zaten tartışıldı ve bu cevap yeni bir şey
eklemiyor

@Konrad Rudolph, bu bir cevap değil, bir yorum.
superM

@superM Bence kendi cevabını hak edecek kadar değerlidir, çünkü OP'nin öncelikle arabirimlere karşı karar verme nedenini açıkça ele alır.
Konrad Rudolph

1

Tanımladığınız yöntem için ihtiyatlı olanı döndürürsünüz. Yaptığınız şey bir dizi öğeyi döndürmek mi (odak öğeler üzerinde) mı, yoksa bir öğeler koleksiyonu döndürmek mi (odak bir bütün olarak koleksiyonda)? Koleksiyonun uygulanmasında değişikliğe izin vermek faydalı mıdır? Bir jeneratör kullanmak ya da HashSetsadece kullanmak mantıklı olmazsa List.


1

Örnek yöntemine Özgül: haklısın o dönen IEnmuerable<T>Eğer işlevselliğini kaybedecek anlamına geleceğini Count(LINQ yöntemleri kullanmak her ne kadar ve indeksleme Count()ve ElementAt()aslında aletler üzerindeki alıştığınız tipi eğer etkili bir şekilde uygulanması, IList<T>).

Eğer geri dönerseniz IList<T>, bazı işlevleri kaybedersiniz, ancak genel olarak kazanç muhtemelen buna değer.

Ancak daha da iyisi IEnumerable<T>ve arasında bir şey olurdu IList<T>, çünkü büyük olasılıkla tüketicinin iade edilen koleksiyonu mutasyona uğratması mantıklı değildir, ancak kullanımı Countveya dizine eklemesi mantıklıdır .

.Net 4.5, bu tür arayüz vardır: IReadOnlyList<T>.


IReadOnlyListVS2013 alabilirsiniz zaman iyi geliyor, teşekkürler!
Matthew
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.