如何创建包含按值传递的列表(或类似列表)的 CLI 值类?
-
21-09-2019 - |
题
我们有一个 C++ 库,它使用包含结构体的 STL 向量的结构体,如下所示:
struct Params
{
// values...
}
struct Settings
{
std::vector<Params> m_params;
// values...
}
我正在为该库编写一个 CLI 包装器,并且我想要上述结构类型的等效项。我一直在考虑使用 List 作为向量的等价物,如下所示:
public value struct Params
{
// values...
}
public value struct Settings
{
List<Params>^ Params;
// values...
}
但由于 List<T> 是引用类型,因此列表通过引用而不是值传递。有没有办法创建一个 CLI 类,其中包含一个按值传递的列表(或类似列表)以及其余成员?
解决方案
我同意mcdave的答案,这可以归结到你的要求不被支持。
我猜测,你的主要观点是无法得到的实际传递的价值,但更多得到传递按值行为即可。想想System.String
的。这是不是一个真正的价值类型,但是你可以通过引用各地安全,因为字符串不能修改,只能结交新朋友。
要得到一个列表相同,可以使型Params
的IList<Param>
的属性。当分配给它,将内容复制到一个新的List<Param>
和存储IList
指针调用AsReadOnly()
当你。从现在起,IList
指向不能被修改的对象。如果结构是按值传递,指针会被复制,但没关系,因为它指向的东西是不可改变的。如果你的对象被周围很多过去了,这也将是更快,因为没有必要为一个deepcopy的每次。
其他提示
我不认为你可以通过值来回传递您的设置类,因为“值类型不能包含用户定义的特殊成员函数”(的)如复制构造.ASPX”相对= “nofollow noreferrer”>
可以使用实现类似的效果:
public value struct Settings : public ICloneable
{
List<Params>^ m_params;
virtual Object^ Clone()
{
Settings^ rv = gcnew Settings();
rv->m_params = gcnew List<Params>();
rv->m_params->AddRange(m_params->ToArray());
return rv;
}
}
在你的C#代码,你将不得不:
Settings s1, s2;
// ... some code modifying s1
s2 = (Settings)s1.Clone();
这是近作为Settings settings1 = settings2;
风格的语法您按值传递获得尽可能干净。
怎么样 List<Params>^% Params;
或者 List<Params%>^% Params;
?
不隶属于 StackOverflow