C#属性显式设置与覆盖获取

时间:2015-01-02 14:42:18

标签: c# properties override

简短:编写基类属性,我们更喜欢显式set方法还是覆盖get方法?

我的Pages有一个基类。它实现了几个“功能”;某些实例可能想要禁用该功能,这在设计时是已知的(即它不会改变)。基类如下所示:

public class MyPage : System.Web.UI.Page
{
  void Method()
  {
    if (Feature1)
      DoSomething1();
  }
}

问题是:首选以下两种定义Feature1属性的方法中的哪一种:

// In MyPage class
private bool _feature1 = true;
protected bool Feature1
{
  get { return _feature1; }
  set { _feature1 = value; }
}

// In Derived page class, somewhere early
Feature1 = false;

// In MyPage class
protected virtual bool Feature1
{
  get { return true; }
}

// In Derived page class
protected override bool Feature1
{
  get { return false; }
}

在第一种情况下,该属性对派生的Page调用具有明确的set;在第二种情况下,该属性没有set,而是允许派生的页面覆盖get。我们有偏好吗?

这个选择适用于更常见的C#案例,而不是我的Pages,但它表明我在某些方面受到限制(例如我不做new,我不负责构造函数,。 ..)

3 个答案:

答案 0 :(得分:1)

根据您的描述,它肯定声音就像您打算成为一个只读字段。

在这种情况下,仅定义属性的get一半,并在派生类中重写它是合适的。

如果有人试图设置编译时错误而不是运行时错误,这也有好处。

当然,如果它的不是应该是只读的,那么你需要实现setter。

答案 1 :(得分:0)

使用auto属性并在构造函数中设置值。

protected bool Feature1 { get; set; } 

// Your Constructor    
public YourClassName(bool featureState)
{
     Feature1 = featureState;
}

答案 2 :(得分:0)

最好覆盖set。由于它在派生类中没有任何功能,你或其他人可能想要设置在这种情况下无效的值,然后在几天或几周后你想知道为什么它设置Feature1不能按预期工作。所以如果有人试图设置它,你最好抛出异常:

override bool Feature1
{
    get { return true; }
    set { throw new InvalidOperationException("In this implementation 'Feature1' is read-only."); }
}

示例:

class Program
{
    static void Main(string[] args)
    {
        bool baseFeature1a = new Base1().Feature1; // false
        bool baseFeature1b = (new Derived1() as Base1).Feature1; // true

        bool baseFeature2a = new Base1().Feature2; // false
        bool baseFeature2b = (new Derived1() as Base1).Feature2; // true
    }
}

class Base1
{
    private bool feature2 = false;

    public virtual bool Feature1
    {
        get { return false; }
    }

    public virtual bool Feature2
    {
        get { return feature2; }
        protected set { feature2 = value; }
    }
}

class Derived1 : Base1
{
    public Derived1()
    {
        Feature2 = true;
    }

    public override bool Feature1
    {
        get { return true; }
    }
}