为什么要使用getter和setter?
答案 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和setter来访问该字段,那么您在课堂上也可以获得同样的好处。所以对于很多人来说,这是他们一直在做的事情。
吸气剂和制定者最初看起来并不那么好,因为它们看起来像是一个额外的打字。但是,如果您愿意,像Eclipse这样的IDE可以自动为您创建getter和setter。使用缩写语法,Objective-C和Ruby等语言也可以这样做。 C#可以在“属性”中包含getter和setter,它们在代码中就像字段一样使用,但在引擎盖下它会调用你编写的getter和setter。
所以有很多理由使用getter和setter,还有很多设施可以减少痛苦。
答案 4 :(得分:1)
一个原因是在某些语言中为对象提供更统一的接口 - 您不再需要处理字段和方法之间的语法差异;你总是处理方法。
第二个原因是您隐藏了对象的实现,允许您在内部更改它而不影响其客户端。一个典型的例子是坐标之一 - 如果你有一个通过笛卡尔坐标表示的坐标,并将内部表示切换到极坐标,如果使用了getter和setter,即使x和y字段消失,你的程序仍然会工作。这也允许您使用多态 - 两个表示相同抽象的对象,但每个对象具有不同的状态实现。
通过方法访问状态还允许您添加同步等内容。