在C#中何时使用string[]和list<string>?

41

String[]list<string>轻量级。因此,如果我没有任何需要操作集合的需求,我应该使用string[]还是总是建议选择list<string>

在使用list<string>时,我们需要执行null检查吗?


1
在任何引用类型上,包括列表中,您需要执行 null 检查。 - J.W.
@ J.W. 1 分钟赞:对于任何引用类型,空值检查都是必要的。 - Biki
6个回答

62

使用string[]处理静态数组:您不需要添加或删除元素->只通过索引访问元素。 如果您需要修改集合,请使用List<string>。如果您仅打算循环遍历内容并且从不按索引访问,则使用IEnumerable<string>


抱歉,我知道这是一个“老”帖子,但您能否给出在那种情况下使用string[]的原因(或链接)?我在MSDN上找不到关于String[]相对于List<string>的优点的任何信息。它是否更轻量级,因此更适合静态数组? - Dave
1
@DaveRook 你说得没错:List<> 带有许多函数等额外开销。String[] 是一个简单的基本数组,没有额外的“功能”。如果你想要速度,并且不需要动态地改变列表,请使用 string[]。 - Nathan White

9
如果集合不应被修改,请使用string[]或更好的选择是IEnumerable<string>。这表示字符串集合应被视为只读字符串集合。
在您的API中使用IEnumerable<string>还可以打开底层实现的更改,而不会破坏客户端代码。您可以轻松地使用字符串数组作为底层实现,并将其公开为IEnumerable<string>。如果在以后的某个阶段实现更适合使用列表或其他结构,则可以更改它,只要它支持IEnumerable<string>即可。

4

我认为你已经很好地总结了。

如果你的列表大小不会改变,而且你不需要任何高级的列表功能,比如排序,那么String[]更可取,因为正如你所说,它是轻量级的。

但要考虑潜在的未来需求——是否有可能你将来会想要使用List做些什么?如果是这样,请考虑现在就使用List。

你需要检查null值,无论是在String[]中还是在List中。这两种类型都可以有null值。


7
做最简单的事情。考虑“未来可能需要的要求”是危险的,这让我想起了大设计先行的做法 :) - Peter Lillevold
2
@Peter 我同意你的观点,但我认为这是企业应用程序开发者的思维方式,而我来自组件编写背景,必须考虑用户可能想要使用组件的所有功能。正如其他人所建议的那样,这在很大程度上取决于上下文。 - Matt
嗯,我看到过很多代码中List到处都是,只因为使用起来方便。这样做会导致对实现的锁定结果。如果一个组件,无论是企业级的还是非企业级的,提供一个数据列表,那么合同和该组件的目的应该决定返回什么数据类型。如果客户端需要修改集合,只需要新建一个 List 就可以了。 - Peter Lillevold

2
我认为这取决于你想要实现什么。但总的来说,我的意见是你可以使用一个很好的框架来帮你完成很多艰难的工作 (例如使用List<>而不是数组)。
看一下像List<>这样的类所提供的成员,你就会明白我的意思:除了不必太担心数组容量和索引越界异常外,List和其他ICollection/IList类还提供了Add、Remove、Clear、Insert、Find等方法,这些方法非常有用。我也相信。
myList.Add (myWidg);

相对于

,这种写法更易读、易维护。

myArr [i] = myWidg;

2
我肯定会投票给List。除了支持各种成员函数之外,它还提供“没有元素”的概念。可能有一个没有元素的列表,但不能有一个没有元素的数组。因此,如果我们遵循不从函数返回null的最佳实践,则可以在不进行null检查的情况下安全地检查元素的计数。对于数组,我们必须检查null。此外,我很少使用循环在数组或列表中搜索元素。 LINQ使其整洁,并且我们可以将其与List而不是array一起使用。必须将数组转换为列表才能利用LINQ。

1

这真的取决于情况。任何与性能相关的事情都应该使用数组完成。其他任何事情都可以使用列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接