问题 在课堂内,调用私人会员或其公共财产是否更好? [重复]


这个问题在这里已有答案:


5722
2018-01-28 03:04


起源

和 stackoverflow.com/questions/1545297/... - Marcel Gosselin
谢谢找到那些!我尝试搜索,但我想我没有使用正确的关键字搜索。 - Amberite
SO搜索是 仍然 非常差,您是否尝试过Google和'site:stackoverflow.com'? - Ash


答案:


使用该属性。

我认为该物业应该全权负责管理该领域。

有很多实现无关紧要,但有很多重要的事情 - 很多。另外,这可能有点难以追踪,因为它始终如此 容貌 对。

调用该属性的次数远远少于调用该字段的次数,并且在那里  此规则的例外情况,记录理由。


12
2018-01-28 03:13



使用该属性的一个优点是您可以在每次读/写时设置断点。这在大型,不熟悉的代码库中特别有用。它允许您在调试器中跨越大块代码,但在修改属性时仍然会停止。非常便利。 - Mike Thompson
使用存根进行单元测试时,它也很方便,因为您可以在存根属性上设置值,但不能在私有成员上设置值。 - Jay


这实际上取决于您访问该物业的内容。请考虑以下两种情况:

场景1:您编写了一种方法来对类中的数据提供常见操作:

// assume a hypothetical class Position

public class Circle
{
    private int _radius;
    private int _xpos;
    private int _ypos;

    public int Radius { get { return _radius; } }
    public Position Center { get { return new Position(_xpos, _ypos); } }

    public bool PointInCircle(Position other)
    {
         return distance(this.Center, other) < this.Radius;
    }
}

显然,PointInCircle的行为应该与用户在其中执行代码的行为相同。因此,使用公共属性是有意义的。

场景2:您编写了一种操作底层数据的方法。一个很好的例子就是序列化。您可能希望序列化基础数据成员,而不是属性访问器返回的值。


1
2018-01-28 03:13





取决于,如果您访问该属性,可能会调用“验证”代码。

private int timeSinceLastPropertyAccess;

public int TimeSinceLastPropertyAccess
{
   get 
   { 
      // Reset timeSinceLastPropertyAccess to 0
      int a = timeSinceLastPropertyAccess; 
      timeSinceLastPropertyAccess = 0; 
      return a; 
   }
}

你想在课堂内使用timeSinceLastPropertyAccess时重置它吗?


1
2018-01-28 03:13



这是相当糟糕的吸气剂设计。获取方法不应该修改状态。 - Anon.
太真实,但它表明如果使用吸气剂可能会产生不良影响。 - PostMan
考虑一下我们所说的是在同一个具有这些属性的类中。因此,吸气剂是否足够蹩脚以产生重大副作用完全是您自己的选择。 - Anon.
我们去,一个更好的例子,它应该重置。 - PostMan


只是为了添加一件事,你的例子只询问了吸气剂。另一半是制定者。

有时你会希望对象使用setter,有时你会希望它绕过它们并只是分配底层字段。

例如,假设您有一个名为IsModified的属性。每当对象被修改时,它会告诉你。如果为其中一个基础字段分配了不同的值,您可以让所有的setter将其翻转为true。

现在,如果你正在为该对象提供保湿(从db或其他地方加载),那么你就不希望设置IsModified。因为坦率地说,它还没有被修改。因此,在该方法中,您使用基础字段名称,但在所有其他方法中,您使用属性设置器。


1
2018-01-28 03:36





这取决于,你想做什么属性?私人/公共并不重要,就像调用一个函数一样。

实际上,你只是设置了一个“功能”,以期在访问或更改该值时必须执行某些操作。

这样做的问题是你可能会发现你想做一件事在某些地方被访问,而另一件事在其他地方被访问时,所以你仍然需要改变它的所有“调用”其中一个地方。

事实上,如果访问该变量的一切 - 甚至是私有类函数 - 通过刚刚通过变量的属性来实现,那么为什么还要打扰这个属性呢?为什么不创建名为'MyVariable'的变量然后如果你发现你想要改变/访问它时做一些事情,只需创建另一个名为_MyVariable或其他的变量,然后将MyVariable更改为_MyVariable的属性。

你应该认为属性就像你曾经写过的accessor()和mutator()函数一样,如果你发现你想要在“访问”变量时想要做一些代码,你必须将所有对该变量的调用更改为使用访问器(调用函数,而不是仅访问成员变量),这就是为什么要创建“默认”访问器和matadors,以防万一。正如我上面所说的,你没有c#和属性的问题(除了一个蹩脚的情况,你不能写成员的子成员,如果它的属性......为什么?)


0
2018-01-28 03:38