我正在寻找一种集合的类型/方法,我可以将一个对象添加到一组对象中,然后分别更改该对象的属性,并且这些更改反映在集合中的对象中。创建对象的原始引用的抓包(集合)
我听说List <T>通过引用增加了值,所以我认为引用是对同一个对象。换句话说,我假设:
List<string> valuesList = new List<string>();
string initialValue = "Alpha";
valuesList.Add(initialValue);
initialValue = "Bravo";
bool incorrectAssumption = (valuesList[0] == "Bravo");
我希望'valuesList'包含新值“Bravo”。试过了,我意识到列表拷贝的参考,它不吸收它,所以valueList仍然只有“Alpha”值。有什么方法可以将收集作为它们包含的合法的一小部分对象来使用?
而如果它有助于看到实际的业务需求....
List<BaseWidget> widgets = new List<BaseWidget>();
DerivedWidget specialWidget = new DerivedWidget();
DerivedWidget extraSpecialWidget = new DerivedWidget();
widgets.Add(specialWidget);
widgets.Add(extraSpecialWidget);
specialWidget.Run();
extraSpecialWidget.Run();
if (!widgets.Any(x => x.RunSuccessfully)) return false;
(其中的run()方法设置RunSuccessfully财产,我想已经体现在“小部件,其'list。)
========================================== ==================================
UPDATE
正如答案和评论中指出的那样,业务需求模型和干运行示例之间存在一些差异。我会将这个生命课程压缩成这样:看起来List<objects>
跟踪了他们的变化,而List<values>
没有。
你没有在你的第一个例子“更改对象的属性”,你只是改变一个局部变量来指代不同的对象。你对列表所做的描述(“参考文献应该是同一个对象”)是正确的。第二个例子应该工作得很好,你试过了吗? –
delnan
您的代码将引用复制到列表中,然后创建新的引用。如果String类具有假设的“Content”属性,则initialValue.Content =“Bravo”也会更改列表中的字符串。但它没有一个,字符串是不可变的。将你自己班级的一个对象放入列表中,解决你的问题,这个班级具有这样一个Content属性。 –
(facepalm)我只是用字符串测试行为的一般原理,但是你是对的,*对象*(类)的列表的确如其应该的那样工作。该死的,那很尴尬。不知道这是否仍然是一个有效的问题。 – RJB