gpt4 book ai didi

c# - 在 foreach 循环中转换

转载 作者:行者123 更新时间:2023-12-05 08:43:50 25 4
gpt4 key购买 nike

我遇到了以下代码:

foreach (var row in datatable.Rows.Cast<DataRow>())
{
some code here
}

现在,我认为在 foreach 循环中强制转换是不正确的,因为我认为它在每次循环时都强制转换。但是,我可能错了,也许编译器足够聪明?

相关说明:我怎样才能自己解决这样的问题?

最佳答案

调用 Cast<DataRow>一次,但这实际上会在获取每个项目时对其进行转换。因此, 每次迭代都有一个转换(至少有可能;Cast 在知道不需要时进行了优化)但是只有一个方法调用。 Cast 返回的迭代器将从源(此处为 datatable.Rows)中(懒惰地)获取项目,并根据循环的请求转换每个项目。

查看我的 Edulinq post on Cast 了解更多信息。

虽然这里的水由于Cast有点浑浊懒惰,重要的是要记住 in 右边的表达式只被评估一次。所以一个循环的形式:

foreach (var item in complicatedExpression)
{
...
}

相当于:

var items = complicatedExpression;
foreach (var item in items)
{
...
}

编译器将生成调用 GetEnumerator() 的代码一次,然后使用它的结果迭代集合。

对于此特定示例,使用 Cast 的替代方法将是让编译器将强制转换放在循环本身中:

foreach (DataRow row in datatable.Rows)
{
some code here
}

编译器将在从迭代器中获取每个项目时隐式地对其执行强制转换。这有点偷偷摸摸,因为它不是显然类型转换。

至于如何知道发生了什么 - 你总是可以使用 ildasm看看IL。这可能很有启发性,但有点耗时。

关于c# - 在 foreach 循环中转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805768/

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