我在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正在设置属性,因为它在更改文本后被填充。有没有办法捕获并处理该消息?
答案 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"); }
}