我试图了解何时以及为何使用“getters”和“setters”
有人请提供一些指导。以下结构之间有什么区别 - 请仅查看访问方法。
//EXAMPLE 1: simple accessor method
private static bool _isInitialEditMapPageLoad;
public static bool isInitialEditMapPageLoad
{
get {return _isInitialEditMapPageLoad;}
set {_isInitialEditMapPageLoad = value;}
}
//EXAMPLE 2: accessor method with a conditional test
private static bool _isInitialEditMapPageLoad;
public static bool isInitialEditMapPageLoad
{
get
{
if (currentSession[isAuthorizedUseder] == null)
return false;
else
return _isInitialEditMapPageLoad;
}
set {isInitialEditMapPageLoad = value;}
}
//EXAMPLE 3: just a get accessor method - is this the same as EXAMPLE 4?
private static bool _isInitialEditMapPageLoad = false;
public static bool isInitialEditMapPageLoad
{
get {return _isInitialEditMapPageLoad;}
}
//EXAMPLE 4: simple method
private static bool _isInitialEditMapPageLoad = false;
public static bool isInitialEditMapPageLoad
{
return _isInitialEditMapPageLoad;
}
答案 0 :(得分:8)
你的getter / setter应该是你班级的公共接口。
根据经验,您的所有成员都应该是私密的,除了您希望人们可以访问您班级之外的内容,并且您从不希望您的私人变量可以在您的班级之外直接访问强>
这是一个简单的例子。假设你有一个类,你需要一个age
变量。在这种情况下,您可以在setter中执行验证,而您的外部类不需要知道该值已经过验证。
class Person {
int age = 0;
public int Age {
get { return age; }
set {
//do validation
if (valid) {
age = value;
}
//Error conditions if you want them.
}
}
//More getters/setters
}
答案 1 :(得分:5)
Getters / Setters背后的原因是当用户以无效的方式改变字段时保护类不被破坏,并且它们允许您更改类的实现,同时保持公开的属性不变。
除非您需要某种验证或延迟加载属性,否则通常只需使用自动属性。
public string Name { get; set; }
答案 2 :(得分:3)
1:这是一个简单的属性,可以像公共字段一样使用。如果您有理由向其他用户(即其他类)公开get
和set
操作,并且您不需要任何花哨的东西,就是这样。这也可以用“自动属性”编写,
public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1
自动道具写得快得多,而且在我看来比完整声明更具可读性(如果我看到带有支持字段的完整声明,我希望找到一些复杂性)。
2:这显示了属性的原因之一:使用某些逻辑返回值而不是直接返回值。有人可以随时将公共字段设置为该值。他们可以随时获得价值,并注意false
意味着这不是初始加载或用户未被授权 - 也就是说,某些(简单)逻辑在之前完成返回一个值。
3:此行为仅作为公共字段进行读取 - 有人可以检索该值,但不能设置它。这本质上是一个只读取外部代码的值(不要与readonly
关键字混淆)
4:导致编译错误。假设这应该是一个方法声明,手动定义一个类似于Java的getter,那么它类似于例3.我相信还有其他问题使得这个不完全相同,比如你想要转这个到了一个依赖属性等等。不幸的是,我在那方面的知识很短。
==========
作为一般规则,用户属性限制对类数据的访问。作为一个原则,任何你不能允许其他代码触摸的东西都应该保持这种状态。实际上,您需要能够在类上设置值以更改它们的显示方式,修改所表示的数据等等。使用属性来保持对此交互的最大控制。
如果其他类需要在您的类中查看某些内容,则需要公开getter,而不是setter。除非使用Java方法编写自定义getter方法,否则这对于字段是不可能的。它们还允许您在返回或设置数据之前执行计算或验证。例如,如果你有一些整数值应该在某个范围内(一个范围可以根据你的对象的状态改变,甚至),你可以在setter
检查以确保满足这个条件之前实际上更新你的价值。
尽量避免将所有东西设置为autoprop的陷阱 - 这与将所有内容都设为公共字段没有什么不同。保持一切尽可能私密。除非必要,否则没有吸气剂,除非必要,否则设定者应该在接受之前执行验证输入所需的任何小逻辑,如果合适的话。也就是说,避免另一个陷阱:在getter / setter中放入大量代码。如果它需要超过一些行,你应该创建一个方法而不是一个属性,只是因为它为使用你的代码的其他人提供了一个更大的提示,即会发生一些重大的事情。
答案 3 :(得分:2)
与其他提到的一样,当您希望对象成员可用于其他对象时,请使用getter / setter。
此外,使用autoproperties可以提高yoru代码的可读性(如果您使用的是.NET 2.0或更高版本)。你拥有的例子就是这样的:
// example 1
public static bool IsInitialEditMapPageLoad { get; set; }
// example 3/4 - note that false is the default for bools
public static bool IsInitialEditMapPageLoad { get; private set; }
由于存在验证逻辑,示例3可能保持不变。