【发布时间】:2018-07-14 17:21:02
【问题描述】:
通常,您希望通过为内部状态提供 getter 和 setter 来封装数据。示例:
public class Person {
private int age;
public int Age {
get { return age; }
set { age = value; }
}
}
void Main() {
Person alice = new Person();
alice.Age = 20;
}
但是假设我们发生了这种情况:
public class Person {
private int age;
public int Age {
get { return age; }
set { age = value; }
}
public String WhatIsMyAge() {
return "My age is: " + ???;
}
}
void Main() {
Person alice = new Person();
alice.Age = 20;
Console.WriteLine(alice.WhatIsMyAge());
}
在这里使用属性或字段更好吗?有关系吗?既然我们在原生类里面,我们还关心封装内部吗?
【问题讨论】:
-
Age对于字段来说是一个糟糕的选择,因为它是可变的。Birthdate是更好的选择。 -
除非有非常明确的理由使用字段,否则我总是使用属性。如果您需要更改某些内容(例如,如果您想根据出生日期计算年龄),您将需要寻找一个点
-
@DourHighArch 我想我明白你的意思是它是可变的一个糟糕的选择,但这仅仅是因为有人可能会不小心改变它,还是它是一个更编程的问题? (例如线程安全)
-
您只需使用该属性。否则,你为什么要一个?
-
可变字段存在很多问题,包括持久性、相等比较、竞争条件;但是您的示例的最大问题是正确性。如果检测到
Age == 20,则无法知道它是否正确;自设置以来,它可能已更改。是的,有时可变字段是必要的,但情况并非如此;生日是不可变的,您可以从中计算年龄。
标签: c# oop properties field encapsulation