ati*_*yar 5 encapsulation field properties
我是一个新的程序员,所以请原谅这个问题的任何愚蠢,以下代码如何封装私有数据? -
public class SomeClass
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public SomeClass(int age)
{
this.age = age;
}
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,在属性中没有限制逻辑或过滤逻辑,上面的代码与下面的代码有什么不同 -
public class SomeClass
{
public int age;
public SomeClass(int age)
{
this.age = age;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个代码是否提供任何封装?
它提供了一个封装:它说,"你可以获得并设置Age属性,但我不会告诉你我是如何实现它的."
这不是非常强大的封装,但它确实将实现细节与公共API分开.在根本不改变公共API的情况下,您可以开始将年龄存储在其他地方 - 在两个short
字段中,在某个地方的服务中,作为long
字段的一部分或其他任何内容.您可以在该属性中记录日志以查看它的使用频率.您可以添加一个在年龄变化时被触发的事件(这是一个API更改,但不会破坏现有的调用者).
编辑:有一点需要注意:即使这个现在什么也不做,改以使它做一些事情后来是源代码和二进制兼容.将字段更改为属性不是向后兼容的,无论是源格式还是二进制格式.在大多数情况下,它将是源兼容的,但不是二进制兼容的.在某些情况下,源将不再构建.在更邪恶(并且设想,不可否认)两个版本将构建,但具有不同的效果.
另请注意,从C#3开始,您可以像字段一样轻松地声明一个简单的属性:
public int Age { get; set; }
Run Code Online (Sandbox Code Playgroud)