我正在包装一个本机C++类,它有以下方法:
class Native
{
public:
class Local
{
std::string m_Str;
int m_Int;
};
typedef std::vector<Local> LocalVec;
typedef LocalVec::iterator LocalIter;
LocalIter BeginLocals();
LocalIter EndLocals();
private:
LocalVec m_Locals;
};1)表示这种接口的".NET方式“是什么?返回array<>的单一方法?array<>泛型是否有迭代器,以便实现BeginLocals()和EndLocals()?
( 2)是否应在包装器中将本地值声明为结构?
我真的很想用.NET的风格来表示包装的类,但是我对管理世界非常陌生,而且这种类型的信息让谷歌感到沮丧。
发布于 2008-09-17 17:03:41
迭代器不能完全翻译为“.net way",但它们大致由IEnumerable 和IEnumerator 代替。
而不是
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<本地>项。如果您确实希望控制迭代或使集合更自定义,那么让您的集合实现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)
{
...
}发布于 2008-09-17 19:45:20
@菲利普--谢谢,你的回答确实让我从正确的方向开始。
在查看了您的代码,并在Nish的“C++/CLI in Action”一书中多读了一些之后,我认为使用索引属性返回托管堆上的本地实例的const跟踪句柄可能是最好的方法。最后,我实现了如下类似的东西:
public ref class Managed
{
public:
ref class Local
{
String^ m_Str;
int m_Int;
};
property const Local^ Locals[int]
{
const Local^ get(int Index)
{
// error checking here...
return m_Locals[Index];
}
};
private:
List<Local^> m_Locals;
};https://stackoverflow.com/questions/85033
复制相似问题