C# 数组遍历方法 C#如何使用foreach遍历数组
技术百科
月夜之吻
发布时间:2026-01-23
浏览: 次 foreach能遍历所有一维数组(如int[]、string[]),因其隐式实现IEnumerable;多维数组仅实现非泛型IEnumerable,遍历时元素为object类型,需手动转换且无类型安全。
foreach 能不能遍历所有 C# 数组
能,但前提是数组类型实现了 IEnumerable 或其泛型变体 IEnumerable。C# 中所有一维数组(如 int[]、string[]、MyClass[])都隐式实现 IEnumerable,所以 foreach 可直接用;但多维数组(如 int[,] )只实现非泛型 IEnumerable,foreach 虽能编译通过,但迭代出的元素类型是 object,需手动转换,容易出错且无类型安全。
foreach 遍历一维数组的正确写法
必须确保变量类型与数组元素类型一致,否则编译失败。编译器会自动推导 var 的实际类型,但显式声明更清晰、可读性更强。
string[] names = { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
Console.WriteLine(name);
}
// 等价写法(推荐显式类型,尤其在团队协作或后期维护时)
foreach (var name in names) // var → string
{
Console.WriteLine(name);
}
- 不能写成
foreach (int x in names):类型不匹配,编译报错Cannot convert type 'string' to 'int' - 不能在循环体内修改循环变量本身(如
name = "New"),这只会改局部副本,不影响原数组 - 数组长度为 0 时,
foreach自动跳过,不会抛异常
为什么 foreach 比 for 更安全但更受限
foreach 底层调用数组的枚举器(GetEnumerator()),它封装了索引逻辑和边界检查,因此不会出现 IndexOutOfRangeException;但它禁止在遍历过程中修改被遍历的数组——哪怕只是重新赋值某个元素,也会触发运行时异常 InvalidOperationException: Collection was modified。
- ✅ 安全点:无需关心
Length、下标越界、空引用(只要数组本身不为null) - ❌ 限制点:无法获取当前索引,不能反向遍历,不能跳过元素,不能在循环中增删/重赋整个数组
- ⚠️ 注意:如果数组变量本身被重新赋值(如
names = new string[0];),不算“修改集合”,不会触发异常;但修改数组内容(如names[0] = "X";)会触发异常
遇到 null 数组怎么办
foreach 本身不处理 null,直接对 null 数组调用会抛出 NullReferenceException。必须提前判空,没有捷径。
string[] data = GetData(); // 可能返回 null
if (data != null)
{
foreach (string item in data)
{
Console.WriteLine(item);
}
}
else
{
Console.WriteLine("Array is null");
}别指望 foreach (var x in data ?? new string[0]) 来“兜底”——虽然语法合法,但掩盖了上游可能的逻辑缺陷;null 往往意味着数据缺失或初始化失败,该查原因,不该静默绕过。
# 能在
# 多维
# 也会
# 有一
# 这只
# 跳过
# 循环
# String
# int
# 泛型
# c#
# 报错
# 为什么
# 无类型
# var
# NULL
# foreach
# 封装
# 隐式
# Object
# 遍历
# for
# Length
# Collection
# 变量类型
# 多维数组
# 不为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么更改电脑名称_Windows 11修
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Win10如何卸载自带Edge_Win10彻底卸载
- Win11怎么关闭用户账户控制UAC_Window
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- php打包exe怎么传递参数_命令行参数接收方法【
- Win11截图快捷键是什么_Win11自带截图工具
- Win11 explorer.exe频繁崩溃_修复
- 如何在Mac上搭建Golang开发环境_使用Hom
- Win11怎么格式化U盘_Win11系统U盘格式化
- Go语言中CookieJar的持久化机制解析:内存
- Win11怎么更改管理员名字 Win11修改账户名
- php8.4xdebug无法调试怎么办_php8.
- Python项目维护经验_长期演进说明【指导】
- 如何在 Go 中判断变量是否为函数类型
- 如何使用Golang开发简单的聊天室消息存储_Go
- c++怎么操作redis数据库_c++ hired
- windows如何修改文件默认打开方式_windo
- 如何在 Go 结构体中正确初始化 map 字段
- php485函数怎么捕获异常_php485错误处理
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- 如何在Golang中写入JSON文件_保存结构体数
- 如何在网页无标准表格标签时高效提取结构化数据
- Windows蓝屏错误0x00000023怎么修复
- Windows10系统怎么查看防火墙状态_Win1
- Golang如何实现基本的用户注册_Golang用
- Win11任务栏怎么调到左边_Win11开始菜单居
- Windows10系统怎么查看IP地址_Win10
- Win11无法识别耳机怎么办_解决Win11插耳机
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win11怎么设置任务栏大小_Windows11注
- 如何在JavaScript中动态拼接PHP的bas
- c++中的CRTP是什么 c++奇异递归模板模式【
- Win11输入法选字框不见了怎么办_Win11输入
- Win11怎么设置开机自动连接宽带_Windows
- Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系
- PHP 中如何在函数内持久化修改引用变量的指向
- Django 测试数据库表缺失与字段未创建问题的完
- C++如何使用std::transform批量处理
- c++中的Tag Dispatching是什么_c
- Linux怎么设置磁盘配额_Linux系统Quot
- c++怎么处理多线程死锁_c++ lock_gua
- c++23 std::expected怎么用 c+
- LINUX如何开放防火墙端口_Linux fire
- Win11摄像头无法使用怎么办_Win11相机隐私
- Windows10如何更改盘符名称_Win10重命
- Win11怎么更改系统语言_Win11中文语言包下


QQ客服