我是新来的程序员,所以请原谅这个问题,下面的代码如何封装私有(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/