有没有理由不使用“受保护”属性?

时间:2011-02-01 13:32:35

标签: c# .net protected

只是想知道......

有没有理由不使用受保护的属性?

我的意思是代替使用它:

public abstract class Foo
{
    protected Bar { get; private set; }
}

使用这个:

public abstract class Foo
{
    private Bar _bar;

    protected Foo(Bar bar)
    {
        _bar = bar;
    }

    protected GetBar()
    {
        return _bar;
    }
}

4 个答案:

答案 0 :(得分:9)

我认为没有任何理由可以使用GetXXX()方法而不是属性而不管它的修饰符。

由于您使用C#标记标记了此问题,因此我严格建议您使用第一种方法。这就是属性的用途。

只有在每次调用它时返回的值可能不同时才使用方法,无论其状态如何。例如,DateTime.Now是一个错误,应该是一种方法。

有关详细信息,请参阅属性Usage Guidelines on MSDN。另一方面,令人惊讶的是,自Framework 1.1以来他们没有必要对其进行更改。

答案 1 :(得分:1)

使用属性而不是方法的其他几个原因:

  • 数据绑定只能看到属性
  • 您可以使用只读或只写语义。

答案 2 :(得分:0)

只有在类

中有不可写或不可读的属性时

答案 3 :(得分:0)

问题不在于protected它有更多用于:我为什么要使用属性?

Propeties在逻辑上等同于Getter / Setter方法对,无论你使用Name {get{} \ set{}}使用GetName() \ SetName()对可以做什么,反之亦然,尤其是当C#具有getter和setter访问器时,所以我们也可以使用辅助功能。

但是,有些人认为公共(或受保护)属性有点像从OOP角度作弊,特别是如果属性所做的只是公开支持字段。毕竟person.Name = "SWeko"似乎在外部改变了对象的状态,而person.SetName("SWeko")只是告诉对象它需要改变它的状态。从纯理论的角度来看,我认为这些反对意见是有道理的。

然而,并非我们所有人都拥有象牙塔的奢侈品,所以属性的概念非常有用,因为它更易读,更不容易出错,而恕我直言,更接近现实世界的模型。当我写这样的东西时,它也为我们提供了一种二分法:

person.Name = "SWeko";
person.Work();

我希望第一行是快速赋值,并且不会产生副作用,而我希望第二行会做更多的事情,并且可能会影响对象的内部状态。当我使用Getter和Setter方法时,没有明显的这种干扰:

person.SetName("SWeko");
person.Work();