如何修改c++ CLI Dictionary中的值



我尝试修改一个结构体的值,该结构体存储为Dictionary<>中的值,但我可以更改该值,但它不会在字典本身中更新:

using namespace System::Collections::Generic;
value struct amplPhse {
double ampl;
double phse;
int    indx;
bool   actv;
};
Dictionary<String ^, amplPhse> constituent;
bool
activate(String^ comp, bool flag) { 
bool     retv = false;
amplPhse ^trgt;
if (constituent.ContainsKey(comp)) {
trgt = constituent[comp]; 
trgt->actv = flag; 
retv = true;
}
return retv;
}
// Fill Dictionary with data ... and activate a component
fillDictionary();
activate("Comp", true);

调用activate()函数后,trgt->actv被设置为true,但constituentDictionary中对应的元素不为true。我不清楚为什么在字典中没有访问value->actv标志。

问题您的Dictionary元素来自值结构它是值类型而不是引用类型。
你可以在这里看到一些更一般的信息:c#中引用类型和值类型的区别是什么?

当您从Dictionary获得一个值时,使用以下行:

trgt = constituent[comp];

您实际上获得存储在Dictionary中的值的副本,并修改该副本。

有两种解决方法:

  1. 如果您可以将amplPhse修改为ref class,代码将按照您的期望运行:
ref class amplPhse {
public:
amplPhse(bool a) : actv{ a } {}
bool   actv;
};
int main()
{
Dictionary<String^, amplPhse^> constituent;
constituent.Add("k1", gcnew amplPhse{false});
Console::WriteLine(constituent["k1"]->actv);
amplPhse^ trgt = constituent["k1"];
trgt->actv = true;
Console::WriteLine(constituent["k1"]->actv);
return 0;
}
  1. 如果你不能修改amplPhse,你可以把它包装在一个引用类型中,并将包装器存储在Dictionary中:
value struct amplPhse {
bool   actv;
};
ref class amplPhseWrapper
{
public:
amplPhseWrapper(amplPhse a) : ampl{ a } {}
amplPhse ampl;
};
int main()
{
Dictionary<String^, amplPhseWrapper^> constituent;
constituent.Add("k1", gcnew amplPhseWrapper{amplPhse{ false }});
Console::WriteLine(constituent["k1"]->ampl.actv);
amplPhseWrapper^ trgt = constituent["k1"];
trgt->ampl.actv = true;
Console::WriteLine(constituent["k1"]->ampl.actv);
return 0;
}

两种情况下的输出都是:

False
True

Dictionary中的值被修改。

相关内容

  • 没有找到相关文章

最新更新