C#中程序员应使用foreach var替代foreach具体类吗?两段代码孰优孰劣?
关于C#中
foreach写法的疑问解答 嘿,这俩问题在C#开发者圈子里真的挺常见的,我来给你唠明白~
一、foreach var vs foreach 具体类:该怎么选?
其实没有绝对的“必须替代”,得看你的集合类型和代码场景:
- 如果你的集合明确是某个具体类型的强类型集合(比如
IEnumerable<CloudBlockBlob>),那两种写法编译后的效果完全一致:
这时// 强类型集合下,两种写法没区别,编译后代码一样 foreach (CloudBlockBlob b in allBlobs) { ... } foreach (var b in allBlobs) { ... }var就是帮你省点力气,不用重复写一遍已经明确的类型名,可读性也不会打折扣——毕竟集合命名清晰的话,读者一眼就能推断出b的类型。 - 如果你的集合是弱类型/基类型集合(比如
IEnumerable<IListBlobItem>,里面混着CloudBlockBlob子类实例),那foreach 具体类直接会编译报错,因为编译器没法保证每个元素都是CloudBlockBlob。这时候你要么用var再显式转换(就像你的代码块2),要么用更安全的OfType<CloudBlockBlob>()先过滤:// 既安全又简洁的写法:自动跳过非目标类型的元素 foreach (var b in allBlobs.OfType<CloudBlockBlob>()) { res.Add(b.Name); }
二、你的两段代码哪一种更优?
先拆解下两段代码的问题:
代码块1:
foreach (CloudBlockBlob b in allBlobs) { res.Add(b.Name); }
这段能跑的前提是allBlobs必须是CloudBlockBlob的强类型集合,如果它是基类型集合(比如IEnumerable<IListBlobItem>),一旦里面有非CloudBlockBlob的元素,运行时直接炸锅——抛强制转换异常。
代码块2:
foreach (var listBlobItem in allBlobs) { var b = (CloudBlockBlob) listBlobItem; res.Add(b.Name); }
它能处理基类型集合,但同样有坑:只要集合里有非CloudBlockBlob的元素,强制转换还是会抛运行时异常,根本没解决本质问题。
所以更优的写法其实是两者之外的第三种:
- 如果业务允许跳过非目标类型元素:用
OfType<>,安全又省心 - 如果业务要求集合必须全是
CloudBlockBlob:用Cast<>,一旦有不符合的元素立刻抛异常,方便快速排错
// 允许跳过非CloudBlockBlob的元素 foreach (var b in allBlobs.OfType<CloudBlockBlob>()) { res.Add(b.Name); } // 强制要求所有元素都是CloudBlockBlob,不符合就报错 foreach (var b in allBlobs.Cast<CloudBlockBlob>()) { res.Add(b.Name); }
三、为什么foreach (var ...)写法更流行?
主要是这几个原因:
- 够简洁:不用重复写已经明确的类型名,减少代码冗余——比如你知道
allBlobs是Blob集合,写var比反复敲CloudBlockBlob舒服多了。 - 够灵活:后续如果修改集合类型(比如把
CloudBlockBlob换成自定义的MyCustomBlob),foreach循环里的代码不用跟着改,省了不少维护成本。 - 可读性没毛病:只要集合命名清晰(比如
allBlobs一看就知道是Blob集合),var不会让代码变难读,反而能让读者更快聚焦到循环里的业务逻辑,而不是重复的类型声明。
当然也有适合写具体类型的场景:比如集合类型不明确,或者你想刻意强调变量类型的时候,写具体类型能让代码更直白。但总体来说,var带来的好处在大多数场景下更突出,所以才会成为主流写法。
内容的提问来源于stack exchange,提问作者Üh Lieh
相关产品推荐
相关产品推荐

