Как переопределить унаследованное свойство от RichTextBox? - PullRequest
1 голос
/ 25 августа 2010

Я написал собственный элемент управления в C #, который наследуется от RichTextBox. Цель этого элемента управления состоит в том, чтобы содержать все улучшения и изменения, такие как измененная нумерация строк и заставить элемент управления перекрашивать себя только тогда, когда это необходимо.

Вчера я заметил скачки памяти (и часто исключения OOM) при доступе к свойству Lines этого элемента управления (иногда в элементе управления содержится более 600 000 строк). Я закодировал обходные пути, которые больше не включают его, но я все же хотел бы полностью удалить его, чтобы люди, которые используют мой контроль в будущем, не использовали его.

Свойством Lines является System.Windows.Forms.TextBoxBase.Lines. В идеале я бы хотел, чтобы строка [] для этого свойства никогда не затрагивалась; когда я загружаю текст в элемент управления, я НЕ хочу, чтобы элемент управления что-либо делал для заполнения этого свойства строк (поскольку оно совершенно бессмысленно и потребляет некоторое время и ресурсы).

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: я пытался

        public override string[] Lines
        {
            get { return null; }
            set { ; } // do nothing
        }

Но VS говорит, что «не может переопределить унаследованный член System.Windows.Forms.TextBoxBase.Lines.get, потому что он не помечен как виртуальный, абстрактный или переопределенный.

Так что, похоже, я не могу переопределить или удалить его. Я думаю, что RichTextBox устанавливает свойство, потому что оно заполняется после изменения текста. Есть ли способ для меня, чтобы захватить и обработать это сообщение?

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Хм, это может замедлить приличного программиста не более чем на 5 минут:

string[] lines = ((RichTextBox)myEditor1).Lines;

, который будет дуть так же сильно. Нет особого смысла пытаться предотвратить использование вашего класса, который можно использовать в любом случае. Свойство Lines должно быть полезно любому, кто использует ваш редактор, оно охватывает основную потребность в получении текста, который был отредактирован. Не выбрасывайте ребенка с водой из ванны.

Настоящая проблема здесь заключается в том, что RTB использует так много неуправляемой памяти для хранения текста, оставляя мало места для кучи собранного мусора. Это становится очень медленным, когда вы прокачиваете в него тысячи линий. Ни одному компоненту не должно быть позволено поглотить половину всей доступной памяти. Либо ограничьте количество строк, которые вы разрешаете редактировать, либо используйте лучший редактор, например ScintillaNET.

Также очень важно быть прагматичным программистом. Помимо сокрытия собственности без необходимости. 600 000 строк в текстовом поле - это огромное количество. Там в 3/4 миллиона слов в Библии, вы отображаете 6 экземпляров Библии в текстовом поле. Ни один здравомыслящий человек никогда не прочтет это, им просто сильно не понравится ваша программа. Не только потому, что это невозможно эффективно использовать, но и потому, что это аварийное ведро.

0 голосов
/ 25 августа 2010

Вы пытались скрыть собственность?

public new string[] Lines
{
   get { throw new Exception("Not supported"); }
   set { throw new Exception("Not supported"); }
}
...