【发布时间】:2014-07-17 21:20:17
【问题描述】:
我有一个大项目,我刚刚开始在发布模式下进行第一次测试,但我发现了一个大问题。此代码查找当前可见列表中但不在数据库中的所有对象,并将它们添加到另一个列表以供以后删除。通常,如果没有差异,toRemove 将保持为空。但在 Release 模式下,toRemove 会在没有差异的情况下填充整个 visibleList。
// 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是一个类。它没有任何非常奇特的东西,它只是保存我从数据库中读取的数据。六个左右的字符串值,以及几个格式化它们的函数。 -
张贴
Entry的声明 -
用 ReferenceEquals 替换 Equals,看看差异是否消失。它不应该。然后,找出为什么有时所有“条目”都是对同一个对象的引用。换句话说,看看生成列表的代码。
-
您是否为
Equals编写了覆盖?那是哪里? -
我尝试覆盖
Equals来检查我的成员,但没有成功。我尝试用ReferenceEquals替换Equals,它会在调试和发布中返回false(这是一个开始,但我在这两种情况下都在寻找一个'true'。