封装在哪里?

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)

第一个代码是否提供任何封装?

Jon*_*eet 8

它提供了一个封装:它说,"你可以获得并设置Age属性,但我不会告诉你我是如何实现它的."

这不是非常强大的封装,但它确实将实现细节与公共API分开.在根本不改变公共API的情况下,您可以开始将年龄存储在其他地方 - 在两个short字段中,在某个地方的服务中,作为long字段的一部分或其他任何内容.您可以在该属性中记录日志以查看它的使用频率.您可以添加一个在年龄变化时被触发的事件(这是一个API更改,但不会破坏现有的调用者).

编辑:有一点需要注意:即使这个现在什么也不做,改以使它做一些事情后来是源代码和二进制兼容.将字段更改为属性不是向后兼容的,无论是源格式还是二进制格式.在大多数情况下,它将是源兼容的,但不是二进制兼容的.在某些情况下,源将不再构建.在更邪恶(并且设想,不可否认)两个版本将构建,但具有不同的效果.

另请注意,从C#3开始,您可以像字段一样轻松地声明一个简单的属性:

public int Age { get; set; }
Run Code Online (Sandbox Code Playgroud)

我有一篇关于所有这些的文章,它提供了更多细节.