我尝试修改一个结构体的值,该结构体存储为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,但constituent
Dictionary
中对应的元素不为true。我不清楚为什么在字典中没有访问value->actv
标志。
问题您的Dictionary
元素来自值结构它是值类型而不是引用类型。
你可以在这里看到一些更一般的信息:c#中引用类型和值类型的区别是什么?
当您从Dictionary
获得一个值时,使用以下行:
trgt = constituent[comp];
您实际上获得存储在Dictionary
中的值的副本,并修改该副本。
有两种解决方法:
- 如果您可以将
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;
}
- 如果你不能修改
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
中的值被修改。