如何覆盖RichTextBox的继承属性?

时间:2010-08-25 12:54:15

标签: c# .net richtextbox override

我在C#中编写了一个继承自RichTextBox的自定义控件。此控件的目的是包含所有改进和更改,例如修改的行编号,并使控件仅在应有时重新绘制。

昨天,当我访问此控件的Lines属性时,我注意到了内存峰值(通常是OOM异常)(控件中有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 个答案:

答案 0 :(得分:3)

Hmya,它只会让一个体面的程序员减速不超过5分钟:

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

这将是一样的打击。试图防止使用你的类无论如何都没有多大意义。 Lines属性应该对使用您的编辑器的任何人都有用,它涵盖了能够检索已编辑文本的基本需求。不要用洗澡水把婴儿扔掉。

这里真正的问题是RTB使用了如此多的非托管内存来存储文本,几乎没有留下垃圾收集堆。一旦你输入数千行,它就变得非常慢。任何组件都不应该被允许吞没所有可用内存的一半。要么限制允许编辑的行数,要么使用更好的编辑器,如ScintillaNET。

成为务实的程序员也很重要。不必要地隐藏房产。文本框中的600,000行是一个巨大的数字。圣经中有3/4百万字,你在文本框中显示了6本圣经。没有理智的人会读到这一点,他们会非常不喜欢你的节目。不仅因为它不可能有效使用,还因为它是一个崩溃桶。

答案 1 :(得分:0)

你有没有试过遮住财产?

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