2011-03-29 13 views
4

我正在用c#编写一个类。c#中密封字符串属性的用法#

我偶然发现了这片建议的由代码重构提供。而且我没有

得到究竟是什么意思工具时,它提出了这样的建议/改进。

现状:

我用this.Text属性设置在我的Form类的构造函数的称号。

Form() 
{ 
    //some initialization code ... 

    //... 

    this.Text = "Non modal form";   //Suggestion offered here.. 
} 

的代码重构工具提示警告:话说访问虚拟成员

要纠正此工具自动添加一个属性

public override sealed string Text 
    { 
     get { return base.Text; } 
     set { base.Text = value; } 
    } 

任何人都可以解释我如何加入一个密封的属性将影响/改善情况。

干杯

回答

5

您调用构造一个虚拟的成员。如果类是继承的并且该属性被调用,则代码将不会运行。由于它不能在子类中重写,所以将其封闭可以防止这种情况发生。这不应该影响此特定示例中的任何内容。

+0

这个事实在这里有很好的解释:http://stackoverflow.com/questions/119506/virtual-member-call-in-a-constructor – 2011-03-29 12:46:16

1

既然你设置在你的构造一个virtual属性,重构工具是在暗示密封属性,以使值不能在继承类它不能在继承类重写的改变。

这不会提高性能,也不是有意义的,你有情况(一Form)。 所以我会忽略它

+1

这并不妨碍从改变属性的值继承的类。它可以防止继承类改变属性的*行为*。 – 2011-03-29 12:44:59

+1

此外,这里还是建议这样做,因为从构造函数中调用虚拟成员是一种不好的做法,因为您可能会导致代码在尚未构建的类(继承类)上执行。 – 2011-03-29 12:45:57

+0

这不能在基类中重写,这是不是baheviour ??! – Aliostad 2011-03-29 12:46:24

1

这将帮助,因为没有派生类可以override它。

1

当你正在处理一个Form,另一种选择是只将您的初始化代码到Load事件处理程序(如乔恩斯基特here描述):

Load += delegate 
{ 
    this.Text = "Non modal form"; 
}; 

使用Load事件要简单得多比创建密封属性,特别是如果您访问多个虚拟属性。