可能重复:
C# - 何时使用属性而不是函数
我试图了解何时以及为何使用"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;
}
Run Code Online (Sandbox Code Playgroud)
你的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
}
Run Code Online (Sandbox Code Playgroud)
Getters/Setters背后的原因是当用户以无效的方式改变字段时保护类不被破坏,并且它们允许您改变类的实现,同时保持公开的属性不变.
除非您需要某种验证或延迟加载属性,否则通常只需使用自动属性.
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
1:这是一个简单的属性,可以像公共字段一样使用。如果您有理由将get和set操作公开给其他用户(即其他类)并且不需要任何花哨的东西,就是这样。这也可以写成“自动属性”,
public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1
Run Code Online (Sandbox Code Playgroud)
auto 属性的编写速度要快得多,并且在我看来比完整声明更具可读性(如果我看到带有支持字段的完整声明,我预计会发现一些复杂性)。
2:这说明了属性的原因之一:使用一些逻辑来返回一个值而不是总是直接返回一个值。有人可以随时设置此值,就像设置公共字段一样。他们也可以随时获取该值,但需要注意的是,这false意味着这不是初始加载,或者用户未获得授权——也就是说,在返回值之前会完成一些(简单的)逻辑。
3:这作为一个公共字段仅用于读取——有人可以检索该值,但不能设置它。这本质上是一个仅供外部代码读取的值(不要与关键字混淆readonly)
4:导致我出现编译错误。假设这应该是一个方法声明,像在 Java 中那样手动定义一个 getter,那么它与示例 3 类似。我相信还有其他问题使得这不完全相同,比如如果你想把它变成这样不幸的是我在这方面的知识还不够。
=========
作为一般规则,用户属性会限制对类数据的访问。原则上,任何可以阻止其他代码接触的内容都应该保持这种方式。实际上,您将希望能够在类上设置值以更改它们的显示方式、修改表示的数据等等。使用属性来最大程度地控制此交互。
如果其他类需要查看您类中的某些内容,则需要公开 getter,但不需要公开 setter。这对于字段来说是不可能的,除非您使用 Java 方法编写自定义 getter 方法。它们还允许您在返回或设置数据之前执行计算或验证。例如,如果您有一些整数值应该在某个范围内(甚至可以根据对象的状态而改变的范围),则您setter可以在实际更新值之前检查以确保满足此条件。
尽量避免将所有内容设置为自动道具的陷阱——这与将所有内容设置为公共领域没有什么不同。尽可能保持一切私密性。除非必要,否则不使用 getter,除非必要,否则不使用 setter,并且 setter 应该在接受输入之前执行任何必要的小逻辑来验证输入(如果适用)。也就是说,要避免另一个陷阱:将大量代码放入 getter/setter 中。如果需要多行代码,您可能应该创建一个方法而不是属性,因为它向使用您的代码的其他人提供了更大的提示,表明即将发生大事。
| 归档时间: |
|
| 查看次数: |
16790 次 |
| 最近记录: |