Я знаю, що про це було багато повідомлень, але все одно мене бентежить, чому ви повинні передати такий інтерфейс, як IList, і повернути такий інтерфейс, як IList, замість конкретного списку.
Я прочитав багато публікацій, в яких говориться, як це полегшує подальші зміни в реалізації, але я просто не до кінця розумію, як це працює.
Скажіть, чи є у мене такий метод
public class SomeClass
{
public bool IsChecked { get; set; }
}
public void LogAllChecked(IList<SomeClass> someClasses)
{
foreach (var s in someClasses)
{
if (s.IsChecked)
{
// log
}
}
}
Я не впевнений, як використання IList допоможе мені в майбутньому.
Як щодо того, якщо я вже використовую метод? Чи повинен я все ще використовувати IList?
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 зараз?
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;
}
Як зараз? Чи є якась нова реалізація списку int, які мені потрібно буде змінити?
В основному, мені потрібно побачити деякі фактичні приклади коду того, як використання IList вирішило б якусь проблему, аніж просто взяв List у все.
З мого прочитання я думаю, що я міг використовувати IEnumberable замість IList, оскільки я просто переглядаю речі.
Редагувати Отже, я бавився з деякими своїми методами, як це зробити. Я все ще не впевнений у типі повернення (якщо я повинен зробити це більш конкретним чи інтерфейсом).
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;
}
Зараз я повертаю IList за простий факт, що потім я додаю це до своєї моделі домену, що має таку властивість:
public virtual IList<AvailableFeature> AvailableFeatures { get; set; }
Вищезазначений сам IList, оскільки це, здається, стандарт для використання з ніхірнатам. Інакше я міг би повернути IEnumberable назад, але не впевнений. Проте я не можу зрозуміти, що потрібно на 100% користувачеві (саме тут повернення бетону має перевагу перед).
Редагувати 2
Я також думав, що трапиться, якщо я хочу передати посилання у своєму методі?
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);
}
}
}
я б не зіткнувся з цим? Оскільки вони не можуть передавати масив (який має фіксований розмір)? Чи було б краще, можливо, для конкретного Переліку?