我在一些C#代码中发现了奇怪的行为,无法解释。可能是因为我缺少重要的理解,所以希望有人能为我点亮灯。
以下是一段类似于这样的代码块:
IEnumberable<myObject> objects = GetObjectsFromApiCall();
for (int i = 0; i < objects.Count(); i++)
{
if (String.IsNullOrEmpty(objects.ElementAt(i).SubObject.Title))
{
SubObject sub = GetSubObjectFromDatabase((long)objects.ElementAt(i).SubObject.Id);
if (sub != null)
{
objects.ElementAt(i).SubObject.Title = sub.Title;
}
}
}
当你逐步执行它时,这段代码似乎一切正常。"objects"集合按预期被填充。"sub"作为收集到的内容被获取并具有完整的预期属性,包括一个填充的Title属性。在执行过程中没有抛出任何错误。
但是...每个Object中存在的SubObject.Title属性(只有标准的get;set;代码)仍然保持为空。
我很困惑。有人能解释一下发生了什么吗?
编辑:对于那些建议我不应该使用for循环和ElementAt的人,我开始使用foreach循环,但认为它可能是问题的根源,因为它每次都会获取一个新的SubObject。现在已经修复,感谢您的帮助,ForEach已恢复。
谢谢, Matt
myObject
和SubObject
属性(或字段)的类型都是class
类型,而不是struct
(或interface
)类型?如果方法调用GetObjectsFromApiCall()
每次调用时生成新的数据副本,则您只会修改该副本。在这种情况下,“原始”数据将保持不变。 - Jeppe Stig Nielsen