gpt4 book ai didi

c# - 为什么要使用 IList 或 List?

转载 作者:IT王子 更新时间:2023-10-29 03:40:39 25 4
gpt4 key购买 nike

我知道已经有很多关于这个的帖子,但它仍然让我感到困惑,为什么你应该传入一个像 IList 这样的接口(interface)并返回一个像 IList 这样的接口(interface)而不是具体的列表。

我读了很多帖子说这如何使以后更改实现变得更容易,但我只是不完全明白它是如何工作的。

说如果我有这个方法

  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,因为我只是循环浏览内容。

编辑所以我一直在研究如何做到这一点的一些方法。我仍然不确定返回类型(如果我应该使它更具体或接口(interface))。

 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);
}
}
}

我会遇到问题吗?因为他们不能传入一个数组(具有固定大小)吗?如果有一个具体的列表会更好吗?

最佳答案

这里有三个问题:形式参数应该使用什么类型?我应该为局部变量使用什么?我应该使用什么作为返回类型?

形式参数:

这里的原则是不要要求超过你需要的IEnumerable<T>传达“我需要从头到尾获取此序列的元素”。 IList<T>传达“我需要以任意顺序获取和设置此序列的元素”。 List<T>传达“我需要以任意顺序获取和设置此序列的元素,我只接受列表;我不接受数组。”

如果要求超出您的需要,您 (1) 让来电者做不必要的工作来满足您不必要的要求,并且 (2) 向读者传达虚假信息。只问你要用什么。这样,如果调用者有一个序列,他们就不需要调用 ToList 来满足您的需求。

局部变量:

随心所欲。这是你的方法。您是唯一可以看到该方法的内部实现细节的人。

返回类型:

原理同上,反过来。 提供调用者所需的最低限度。如果调用者只需要枚举序列的能力,则只给他们 IEnumerable<T>。 .

关于c# - 为什么要使用 IList 或 List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com