C#, WinForms: ListBox. Объекты. Добавьте генерирует OutOfMemoryException, почему?

Нет ничего существующего (стоящего доверия, если бы что-либо вообще), и я сомневаюсь, что когда-либо было бы что-либо запланированное официальное.

8
задан Austin Salonen 18 November 2009 в 17:22
поделиться

2 ответа

Это связано с тем, как реализован метод System.Windows.Forms.ListBox.NativeAdd :

private int NativeAdd(object item)
{
    int num = (int) base.SendMessage(0x180, 0, base.GetItemText(item));
    switch (num)
    {
        case -2:
            throw new OutOfMemoryException();

        case -1:
            throw new OutOfMemoryException(SR.GetString("ListBoxItemOverflow"));
    }
    return num;
}

Метод GetItemText использует ToString () для объекта, который возвращает null , и поэтому сообщение отправляется с параметром null , который, в свою очередь, возвращает недопустимый указатель, и вы вводите второй случай, который вызывает исключение.

15
ответ дан 5 December 2019 в 06:37
поделиться

Когда базовый LB_ADDSTRING вызов Windows API терпит неудачу, WinForms всегда возвращает исключение OutOfMemoryException . Комментарий в справочном источнике .NET Framework объясняет, почему:

// On some platforms (e.g. Win98), the ListBox control
// appears to return LB_ERR if there are a large number (>32000)
// of items. It doesn't appear to set error codes appropriately,
// so we'll have to assume that LB_ERR corresponds to item 
// overflow.
// 
throw new OutOfMemoryException(SR.GetString(SR.ListBoxItemOverflow)); 
10
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: