Bu konuda çok fazla gönderi olduğunu biliyorum ama yine de kafamı karıştırıyor, neden IList gibi bir arayüze geçip somut liste yerine IList gibi bir arayüz geri döndürmelisiniz.
Bunun daha sonra uygulamayı değiştirmeyi nasıl kolaylaştırdığını söyleyen birçok yazı okudum, ancak bunun nasıl çalıştığını tam olarak anlamıyorum.
Bu yönteme sahip olduğumu söyle
public class SomeClass
{
public bool IsChecked { get; set; }
}
public void LogAllChecked(IList<SomeClass> someClasses)
{
foreach (var s in someClasses)
{
if (s.IsChecked)
{
// log
}
}
}
IList'i kullanmanın gelecekte bana nasıl yardımcı olacağından emin değilim.
Zaten yöntemde olsam nasıl olur? Yine de IList kullanmalı mıyım?
public void LogAllChecked(IList<SomeClass> someClasses)
{
//why not List<string> myStrings = new List<string>()
IList<string> myStrings = new List<string>();
foreach (var s in someClasses)
{
if (s.IsChecked)
{
myStrings.Add(s.IsChecked.ToString());
}
}
}
IList'i şimdi kullandığım için ne kazanacağım?
public IList<int> onlySomeInts(IList<int> myInts)
{
IList<int> store = new List<int>();
foreach (var i in myInts)
{
if (i % 2 == 0)
{
store.Add(i);
}
}
return store;
}
Şimdi nasıl? Değiştirmem gereken int'lerin bir listesinin yeni bir uygulaması var mı?
Temel olarak, IList kullanmanın List'i her şeyin içine almak yerine bazı sorunları nasıl çözeceğine dair bazı gerçek kod örneklerini görmem gerekiyor.
Okumalarıma göre IList yerine IEnumberable kullanabileceğimi düşünüyorum çünkü sadece bir şeyler arasında dolaşıyorum.
Düzenle Bu yüzden, bunu nasıl yapacağımla ilgili bazı yöntemlerimle uğraşıyordum. Dönüş türünden hala emin değilim (daha somut veya bir arayüz yapmam gerekirse).
public class CardFrmVm
{
public IList<TravelFeaturesVm> TravelFeaturesVm { get; set; }
public IList<WarrantyFeaturesVm> WarrantyFeaturesVm { get; set; }
public CardFrmVm()
{
WarrantyFeaturesVm = new List<WarrantyFeaturesVm>();
TravelFeaturesVm = new List<TravelFeaturesVm>();
}
}
public class WarrantyFeaturesVm : AvailableFeatureVm
{
}
public class TravelFeaturesVm : AvailableFeatureVm
{
}
public class AvailableFeatureVm
{
public Guid FeatureId { get; set; }
public bool HasFeature { get; set; }
public string Name { get; set; }
}
private IList<AvailableFeature> FillAvailableFeatures(IEnumerable<AvailableFeatureVm> avaliableFeaturesVm)
{
List<AvailableFeature> availableFeatures = new List<AvailableFeature>();
foreach (var f in avaliableFeaturesVm)
{
if (f.HasFeature)
{
// nhibernate call to Load<>()
AvailableFeature availableFeature = featureService.LoadAvaliableFeatureById(f.FeatureId);
availableFeatures.Add(availableFeature);
}
}
return availableFeatures;
}
Şimdi basit gerçeği için IList'i geri veriyorum, daha sonra bunu etki alanı modelime böyle bir özelliğe sahip olanı ekleyeceğim:
public virtual IList<AvailableFeature> AvailableFeatures { get; set; }
Yukarıdakiler bir IList'in kendisidir, çünkü bu, nhibernate ile kullanılacak standart gibi görünmektedir. Aksi takdirde IEnumberable'ı geri döndürebilirim ama emin değilim. Yine de, kullanıcının% 100 neye ihtiyaç duyacağını bulamıyorum (bu, bir betonu döndürmenin avantajlı olduğu yer).
Düzenle 2
Yöntemimde referans olarak geçmek istersem ne olur diye de düşünüyordum.
private void FillAvailableFeatures(IEnumerable<AvailableFeatureVm> avaliableFeaturesVm, IList<AvailableFeature> toFill)
{
foreach (var f in avaliableFeaturesVm)
{
if (f.HasFeature)
{
// nhibernate call to Load<>()
AvailableFeature availableFeature = featureService.LoadAvaliableFeatureById(f.FeatureId);
toFill.Add(availableFeature);
}
}
}
bununla sorun yaşar mıyım? Ne zamandan beri bir diziyi (sabit boyutu olan) geçemezler? Somut bir Liste için belki daha iyi olur mu?