【问题标题】:Usage of the sealed string property in c#c#中密封字符串属性的使用
【发布时间】:2011-03-29 12:40:27
【问题描述】:

我正在用 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; }
   } 

谁能解释一下,添加密封属性会影响/改善这种情况。

干杯

【问题讨论】:

    标签: c# .net-2.0


    【解决方案1】:

    您正在构造函数中调用虚拟成员。如果类被继承并且该属性被调用,那么您的代码将不会运行。将其密封可以防止这种情况发生,因为它不能在子类中被覆盖。这不应影响此特定示例中的任何内容。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      当您处理 Form 时,另一种选择是将初始化代码移动到 Load 事件处理程序(如 Jon Skeet here 所述):

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

      使用 Load 事件比创建密封属性要简单得多,尤其是在您访问多个虚拟属性时。

      【讨论】:

        【解决方案4】:

        由于您在构造函数中设置了virtual 属性,因此重构工具建议密封该属性,以便在继承的类中不能更改 值 它不能在继承的类中被覆盖.

        这不会提高性能,在您所拥有的场景中也没有意义(Form)。 所以我会忽略它。

        【讨论】:

        • 这不会阻止继承的类改变属性的值。它防止继承的类改变属性的行为。
        • 此外,这里建议这样做,因为从构造函数中调用虚拟成员是不好的做法,因为您可能会导致代码在尚未构造的类(继承的类)上执行。
        • 这不能在基类中被覆盖,这不是baheviour吗??!
        • 我不确定你在问什么。您的回答表明建议“以便在继承的类中不能更改值”。继承的类当然可以改变值;它是带有公共设置器的公共财产。继承类在密封时不能做的是覆盖行为。
        • 是的,在构造函数中调用虚方法不好,但这不是 Windows 窗体在 InitiliseComponents 中所做的吗?所以在这种情况下(不完全是嵌套层次结构)我会忽略它。
        猜你喜欢
        • 1970-01-01
        • 2016-06-27
        • 2021-01-30
        • 1970-01-01
        • 2014-12-12
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多