Как работает ObjectCollection.Add () - PullRequest
0 голосов
/ 28 января 2019

Вызывает ли ObjectCollection.Add (item) item.Equals ()?Получил CheckedListBox на Form и попытался добавить некоторые предметы.Но я обнаружил, что при вызове CheckedListBox.Items.Add(item) он будет вызывать item.Equals().Кроме того, я обнаружил, что item.GetHashCode() тоже был вызван.Очень смущен тем, почему это произошло.Код указан ниже.

List<Person> people = new List<Person>();//Person is a customer class for test.
people.Add(new Person() { Name = "张三", Id = "201411580572", Gender = "Male" });
people.Add(new Person() { Name = "李四", Id = "201411580573", Gender = "Male" });
people.Add(new Person() { Name = "王武", Id = "201411580574", Gender = "Male" });
people.Add(new Person() { Name = "赵柳", Id = "201411580575", Gender = "Male" });
people.Add(new Person() { Name = "张飞", Id = "201411580576", Gender = "Male" });
people.Add(new Person() { Name = "赵云", Id = "201411580577", Gender = "Male" });

cklTest.DisplayMember = "Name";//cklTest is a CheckedListBox.

people.ForEach(p => cklTest.Items.Add(p));

Редактировать :

стек вызовов

1 Ответ

0 голосов
/ 28 января 2019

Ваш стек вызовов показывает, что вызов поступает с Formatter.FormatObject, который, в свою очередь, вызывает Formatter.IsNullData.

Код IsNullData:

public static bool IsNullData(object value, object dataSourceNullValue) {
    return value == null ||
           value == System.DBNull.Value ||
           Object.Equals(value, NullData(value.GetType(), dataSourceNullValue));
}

Мы видим вызов Object.Equals, чтобы проверить, равен ли ваш объект dataSourceNullValue (aпользовательское значение для представления нулевых данных).Интересно, что в этом контексте dataSourceNullValue равен DBNull.Value, поэтому проверка избыточна с приведенной выше.Но с этим ничего не поделаешь.

Если вы не хотите, чтобы Equals вызывался в этом кодовом пути, вы можете обойти, установив FormattingEnabled в false.Это заставит CheckedListBox использовать альтернативный способ для форматирования вашего объекта:

if (!formattingEnabled) {

    // Microsoft gave his blessing to this RTM breaking change
    if (item == null) {
        return String.Empty;
    }

    item = FilterItemOnProperty(item, displayMember.BindingField);
    return (item != null) ? Convert.ToString(item, CultureInfo.CurrentCulture) : "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...