为什么要使用getter和setter

时间:2010-02-12 14:49:35

标签: encapsulation

  

可能重复:
  Why use getters and setters?

为什么要使用getter和setter?

5 个答案:

答案 0 :(得分:11)

限制对对象内部状态的访问。

考虑一类几何形状的经典例子。比方说,一个Circle对象。设置半径时,您可能希望自动计算区域(这将是一个只读属性)

class Circle
{
     float radius;

    public float Radius
    {
        get { return radius; }
        set { radius = value;  area = Math.Pi * radius * radius;}
    }

    float area;
    float Area
    {
        get { return area;}
    }
}

如果您允许直接访问“radius”数据成员,则在更改时无法更新area。此外,如果您允许直接访问area,则用户可以在不考虑radius的情况下随意更改。

答案 1 :(得分:4)

要进行封装,这样就可以如何在您的类中存储实现细节。如果你的班级有一个getter / setter:

private string _mystring = string.Empty;
public string SomeValue
{
 get
 {
   return _mystring;
 }
}

这使您可以在将来更改管理“SomeValue”的方式。例如,您可能会决定将其存储在字符串中,而不是将其存储在字符串中,它实际上将成为引擎盖下的Guid。现在你可以去:

private Guid _myguid= Guid.NewGuid();
public string SomeValue
{
 get
 {
   return _myguid.ToString();
 }
}

使用您的类和访问“SomeValue”属性的任何地方都将保持不间断。

<强>验证

您也可以验证传入的值,所以在另一个例子中:

private string _mystring = "My Value";
public string SomeValue
{
 get
 {
   return _mystring;
 }
 set
 {
   if (string.IsNullOrEmpty(value))
   {
     throw new InvalidArgumentException();
   }
   else
   {
     _myString = value;
   }
 }
}

确保永远不会将存储的字符串设置为空/空字符串

答案 2 :(得分:2)

封装。

答案 3 :(得分:2)

如果您将字段设为私有并设置getter和setter来访问它,那么所有其他代码都必须通过这些方法来获取该数据。然后,你有更多的控制权。

  • 您可以将其设为只读(无设定者)。
  • 您可以在设置器中验证输入,如果不可接受,则拒绝输入。
  • 只有在首次调用getter时,才能在需要时实例化对象。
  • 您可以稍后更改一切的效果。

如果您严格使用getter和setter来访问该字段,那么您在课堂上也可以获得同样的好处。所以对于很多人来说,这是他们一直在做的事情。

吸气剂和制定者最初看起来并不那么好,因为它们看起来像是一个额外的打字。但是,如果您愿意,像Eclipse这样的IDE可以自动为您创建getter和setter。使用缩写语法,Objective-C和Ruby等语言也可以这样做。 C#可以在“属性”中包含getter和setter,它们在代码中就像字段一样使用,但在引擎盖下它会调用你编写的getter和setter。

所以有很多理由使用getter和setter,还有很多设施可以减少痛苦。

答案 4 :(得分:1)

一个原因是在某些语言中为对象提供更统一的接口 - 您不再需要处理字段和方法之间的语法差异;你总是处理方法。

第二个原因是您隐藏了对象的实现,允许您在内部更改它而不影响其客户端。一个典型的例子是坐标之一 - 如果你有一个通过笛卡尔坐标表示的坐标,并将内部表示切换到极坐标,如果使用了getter和setter,即使x和y字段消失,你的程序仍然会工作。这也允许您使用多态 - 两个表示相同抽象的对象,但每个对象具有不同的状态实现。

通过方法访问状态还允许您添加同步等内容。