我有一个大项目,第一次在发布模式下进行测试时发现了一个大问题。这段代码查找所有当前可见列表中但不在数据库中的对象,并将它们添加到另一个列表以备后续删除。通常情况下,如果没有差异,toRemove
保持为空。但在 发布 模式下,当没有差异时,整个 visibleList
都会被添加到 toRemove
中。
// Find which elements are in the visible list that do not exist in the database
foreach(var tr in visibleList.Where((entry) =>
{
return fullList.Contains(entry);
}))
{
toRemove.Add(tr);
}
经过分析代码并运行一些测试,我将问题缩小到了这个方面:
// Returns true in DEBUG mode, but false in RELEASE mode
// (when entry does in fact equal fullList[0])
bool equalityResult = entry.Equals(fullList[0]);
fullList
和toRemove
只是基本的C# List<Entry>
对象,而visibleList
是一个ObservableCollection<Entry>
。
Entry.Equals
没有被重载。
为什么这个函数在两种配置之间会有不同的行为?我该怎么做才能修复这个问题?
编辑:大部分Entry
的定义如下:
public class Entry : INotifyPropertyChanged
{
public String Name { get; set; }
public String Machine { get; set; }
public Int32 Value { get; set; }
// Output values separated by a tab.
public override string ToString()
{
return String.Format("{0}\t{1}\t{2}", Name, Machine, Value);
}
public String ToCSVString()
{
return String.Format("{0},{1},{2}", Name, Machine, Value);
}
#region WPF Functionality
// Enable one-way binding in WPF
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string name)
{
PropertyChangedEventHandler h = PropertyChanged;
if (h != null)
{
h(this, new PropertyChangedEventArgs(name));
}
}
#endregion
// ...
}
编辑: 我实现了Entry.Equals
,这解决了问题。事实证明,顶部的某些链接错误导致我的代码中的Entry.Equals
更改被排除在发布构建之外。解决了这个问题并实现了Equals
后,一切都像魔法般正常工作。然而,我需要重写这个方法让我感到有点难过,似乎要做太多的工作。
Entry
是一个类。它没有什么非常奇特的,只是保存我从数据库中读取的数据。大约有六个字符串值和一些用于格式化它们的函数。 - SessamekeshEntry
的声明 - BrandonEquals
的覆盖方法吗?它在哪里? - jamesSampicaEquals
来检查我的成员,但它没有起作用。我尝试用ReferenceEquals
替换Equals
,但在调试和发布模式下都会返回false(这是一个开始,但我希望在两种情况下都返回“true”)。 - Sessamekesh