我是新来的程序员,所以请原谅这个问题,下面的代码如何封装私有(private)数据? --

public class SomeClass
{
    private int age;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public SomeClass(int age)
    {
        this.age = age;
    }
}

我的意思是,在属性中没有限制逻辑或过滤逻辑的情况下,以上代码与以下代码有何不同-
public class SomeClass
{
    public int age;

    public SomeClass(int age)
    {
        this.age = age;
    }
}

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

最佳答案

它提供了一种封装:就是说,“您可以获取并设置一个Age属性,但是我不会告诉您如何实现它。”

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

编辑:需要注意的一件事:即使现在不执行任何操作,所做的更改也可以在以后与源代码和二进制文件兼容。将字段更改为属性不能以源或二进制形式向后兼容。在大多数情况下,它将与源兼容,但与二进制不兼容。在某些情况下,将不再构建源。在更多的邪恶中(当然是人为的),这两个版本都将构建,但效果不同。

还要注意,从C#3开始,您可以像字段一样轻松地声明一个琐碎的属性:

public int Age { get; set; }

我有一个article about all of this,它提供了更多详细信息。

关于c# - 封装在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3728034/

10-13 03:09