C# 是否有任何理由不使用';受保护';财产?

C# 是否有任何理由不使用';受保护';财产?,c#,.net,protected,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 Get

只是想知道

是否有任何理由不使用受保护的属性

我的意思是,不用这个:

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;
    }
}

我看不出有任何理由使用
GetXXX()
方法而不是属性,不管它的修饰符是什么

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

仅当方法返回的值每次调用时都可能不同时才使用该方法,而不管其状态如何。例如,
DateTime.Now
是一个错误,应该是一种方法


有关更多详细信息,请参阅属性。另一方面,令人惊讶的是,自从
Framework 1.1

以来,只有当类中有不可写或不可读的属性时,他们才没有必要对其进行更改

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

问题并不是关于
受保护的
它还有更多:我为什么要使用属性

属性与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();

第二个是完全有效的Java;因此,如果你看到这样的C#代码,最有可能的原因是它是由一个尚未真正适应C#的Java程序员编写的。你使用
protected
进行可访问性,它与属性无关。正如ammoQ前面提到的,这可能是从Java移植的代码,也可能是Java程序员的工作——这是Java中的标准。它应该是“纯”的,没有副作用。@leppie:如果你看一下指导原则,列表中有一个方法应该在使用时说明
连续调用成员两次会产生不同的结果。
。当然,它也提到了没有副作用。IMHO,读写属性的行为应该像变量一样。如果一个对象实现了一些读写属性,那么在没有任何中间方法调用的情况下,写入这些属性,然后以任意顺序读取它们,应该会导致它们读回写入的值。对于可写属性更改只读属性的值,或者方法调用更改任何或所有属性(只读或读写)的值,我没有问题,但我不喜欢相互连接的读写读写属性。IMHO,类似StringBuilder的东西。长度应该是只读属性,并与SetLength方法配对。@supercat这将使使用UI控件变得非常乏味,因为它们往往有很多属性,以预期的逻辑方式相互依赖(例如,自动调整大小会影响宽度和高度属性)@SWeko:我认为表单的某些部分缺少一个范例,它有助于提高表单的实用性,那就是将“设置”属性与“当前行为”分离。例如,“可见”应分为“RequestedVisibility”和“IsShown”。“RequestedVisibility”应该是一个读写属性,它总是返回写入的值;“IsShown”应为只读属性,指示控件及其所有父控件是否已设置RequestedVisibility。对于大小调整,应该有请求的大小和实际大小属性,前者是读写的,后者是只读的。@SWeko:如果有方法将对象的当前状态复制到“请求”状态,并有方法从UI编辑器中调用这些方法,肯定会很有用;我可以接受,如果没有这样一个特性,人们可能不得不对属性做一些不好的事情,以使UI编辑器能够很好地工作。然而,尽可能多地根据正交属性定义事物将有助于避免序列化和非序列化对象时出现问题。@Supercat:同样,理论上,这种方法有其优点,因为它将是一种更干净的设计,但与预期的(相当真实的)人类woldview不匹配。更不用说仅仅显示表单就需要大量代码。