2015-05-19 3 views
3

У меня есть общий список под названием connectedEntites, и я добавляю элементы в этот список в цикле for. Я делаю нулевую проверку перед добавлением. Но даже тогда, когда элемент добавляется к этому List<>, также добавляется нулевое значение. Я отлаживал, но теперь можно добавить нулевое значение. Из-за этого нулевого значения, когда я выполняю операцию чтения, программа вылетает (поскольку это программа COM).Общий список добавляет нулевые значения в C#

Ниже приведен код класса

public class EntityDetails 
{ 
    public ObjectId objId { get; set; } 
    public Handle objHandle { get; set; } 
    public string className { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) return false; 
     EntityDetails objAsEntityDetails = obj as EntityDetails; 
     if (objAsEntityDetails == null) return false; 
     else return Equals(objAsEntityDetails); 
    } 

    public bool Equals(EntityDetails other) 
    { 
     if (other == null) 
      return false; 

     return (this.objId.Equals(other.objId)); 
    } 
}` 

Ниже изображение, где вы можете увидеть нулевые значения и емкость также дублирует добавляется элемент, но счетчик показывает правильное значение.

Generic List in Debug Mode

+4

'Count' говорит _2_ не _4_. _ [Емкость всегда больше или равна Count. Если Count превышает Capacity при добавлении элементов, емкость увеличивается за счет автоматического перераспределения внутреннего массива перед копированием старых элементов и добавления новых элементов] (https://msdn.microsoft.com/en-us/library/y52x03h2 (v = vs.110) .aspx) _ – MickyD

+0

Да, это говорит 2. Но почему нулевые значения? – Santosh

+0

Нулевые значения указаны во внутреннем массиве, который использует List. Это деталь реализации, которая не должна беспокоить. Каким образом вы используете список для получения исключения/сбоя? (И они являются нулями, потому что это 'default (EntityDetails)') – Dirk

ответ

7

Внутренняя структура List<> представляет собой массив и массивы имеют определенную длину. Этот массив должен расти каждый раз, когда вы его заполняете, добавляя предметы в List<>. Capacity - это фактическая длина внутреннего массива и всегда автоматически увеличивается, когда Count после добавления равно текущему Capacity. Он удваивается каждый раз, когда он это делает.

Если ваше COM-приложение не может обрабатывать нулевые значения во внутренней структуре (то есть массиве) List<EntityDetails>, вы можете использовать TrimExcess() для удаления этих зарезервированных пространств.

От MSDN:

Емкость всегда больше или равно Count. Если Count превышает Емкость при добавлении элементов, емкость увеличивается на , автоматически перераспределяя внутренний массив перед копированием старых элементов и добавляя новые элементы.

Смотрите также вопрос: List<> Capacity returns more items than added

Смежные вопросы