Я знаю, что на нем было много сообщений, но меня все же путает, почему вы должны проходить в интерфейсе, таком как 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, потому что я просто перебираю вещи.
Edit Поэтому я играл с некоторыми из своих методов о том, как это сделать. Я все еще не уверен относительно типа возврата (если я должен сделать его более конкретным или интерфейсом)
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, поскольку это то, что кажется стандартом для использования с nhibernate. В противном случае я мог бы вернуть 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);
}
}
}
У меня возникнут проблемы с этим? Так как они не могут пройти в массив (который имеет фиксированный размер)? Было бы лучше, может быть, для конкретного списка?