【问题标题】:why listbox1.Items.Add use Equals Method of my Object?为什么 listbox1.Items.Add 使用我的对象的 Equals 方法?
【发布时间】:2012-01-02 17:09:28
【问题描述】:

我正在检查 Windows 窗体 ListBoxCollection 添加方法, 在分析过程中,我发现方法“add”调用了基础对象中的 Equals 方法 为什么这个方法做这个动作?


我使用了“调用堆栈”并且找到了这个答案:

我们调用 :System.Windows.Forms.ListBox.ObjectCollection.Add(object item)

它会调用:System.Windows.Forms.ListBox.ObjectCollection.AddInternal(object item)

它会调用:System.Windows.Forms.ListBox.NativeAdd(object item)

它会调用:System.Windows.Forms.ListControl.GetItemText(object item)

它会调用:System.Windows.Forms.Formatter.FormatObject(object value, System.Type targetType, System.ComponentModel.TypeConverter sourceConverter, System.ComponentModel.TypeConverter targetConverter, string formatString, System.IFormatProvider formatInfo, object formattedNullValue , 对象 dataSourceNullValue)

它会调用 :System.Windows.Forms.Formatter.IsNullData(object value, object dataSourceNullValue)

最后它会调用:object.Equals(object objA, object objB)

which This Method Make My Equal Method too run :

WindowsFormsApplication1.Student.Equals(object obj)

并且将发送到我的 Equals 方法(作为 obj)的最后一个参数是 DBNULL 对象! 什么是 DBNULL?

【问题讨论】:

  • 很难猜,Winforms 没有 ListBoxCollection 类。 ListBox.ObjectCollection.Add() 将是下一个可能的候选者,但它的 Add() 方法不会调用 Equals() 除非列表已排序。查看调用堆栈以了解它是如何到达那里的。

标签: c# .net listbox equals


【解决方案1】:

因为它需要能够知道什么项目正在触发事件。如果对象是完全相同的对象,选择、编辑、删除就会变得困难和混乱。

【讨论】:

  • 对不起,你能解释更多吗?我不明白:-S
  • 我必须做出很多假设,因为您没有提供很多信息。但是如果对象彼此相等,并且是相同的。当您从列表中删除该对象时,您要删除哪个项目?两个,只有一个?因为它们是相同的,所以这是一个令人困惑的操作。
  • 好吧!在 Remove(object obj) 方法中它是合理的,但在 Add(object obj) 方法中我还不明白原因!
  • 好吧,你不能在没有先调用 Add 的情况下调用 Remove。所以这就像鸡或蛋的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2020-06-17
相关资源
最近更新 更多