迭代器不能完全转换为“.net 方式”,但它们大致被 IEnumerable < T > 和 IEnumerator < T > 取代。
而不是
vector<int> a_vector;
vector<int>::iterator a_iterator;
for(int i= 0; i < 100; i++)
{
a_vector.push_back(i);
}
int total = 0;
a_iterator = a_vector.begin();
while( a_iterator != a_vector.end() ) {
total += *a_iterator;
a_iterator++;
}
你会看到(在 C# 中)
List<int> a_list = new List<int>();
for(int i=0; i < 100; i++)
{
a_list.Add(i);
}
int total = 0;
foreach( int item in a_list)
{
total += item;
}
或者更明确地(不将 IEnumerator 隐藏在 foreach 语法糖后面):
List<int> a_list = new List<int>();
for (int i = 0; i < 100; i++)
{
a_list.Add(i);
}
int total = 0;
IEnumerator<int> a_enumerator = a_list.GetEnumerator();
while (a_enumerator.MoveNext())
{
total += a_enumerator.Current;
}
如您所见,foreach 只是为您隐藏了 .net 枚举器。
所以说真的,“.net 方式”只是允许人们为自己创建 List<Local> 项目。如果您确实想控制迭代或使集合更加自定义,请让您的集合也实现 IEnumerable< T > 和/或 ICollection< T > 接口。
几乎直接翻译为 c# 几乎就是您所假设的:
public class Native
{
public class Local
{
public string m_str;
public int m_int;
}
private List<Local> m_Locals = new List<Local>();
public List<Local> Locals
{
get{ return m_Locals;}
}
}
然后用户将能够
foreach( Local item in someNative.Locals)
{
...
}