我知道有很多关于此的文章,但它仍然让我感到困惑,为什么您应该传入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本身,因为这似乎是与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);
}
}
}
我会遇到这个问题吗?由于它们不能传递数组(大小固定)吗?列出具体清单会更好吗?