C# 属性对引用类型字段的封装如何体现?

c#通过属性特性读取和写入字段,而不直接读取和写入,以此来提供对类中字段的保护,可是作如下测试:classTest{privatedouble[]data=newdoub... c#通过属性特性读取和写入字段,而不直接读取和写入,以此来提供对类中字段的保护,可是作如下测试:
class Test
{
private double[] data = new double[]{1,2,3,4};
public double[] Data { get { return data; } }
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
double[] xxx = test.Data;
Console.Write("改前:");
foreach (double x in xxx)
Console.Write(x + " ");
Console.WriteLine();
xxx[0] = 4;
xxx[1] = 3;
xxx[2] = 2;
xxx[3] = 1;
Console.Write("改后:");
foreach (double x in test.Data)
Console.Write(x + " ");
Console.WriteLine();

}
}

结果说明通过改变xxx 改变了私有字段data,属性的保护功能是不是被突破了??
展开
 我来答
阳光的雷咩咩
2014-11-07 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7861万
展开全部
也许你有点混淆概念了。上面的double数组是继承自Array的类,是引用类型,相当于暴露给外部一个指针,而外部通过首指针访问其数组成员是完全合法的,因为数组并没有某个元素私有的语法。上面属性的封装性已经体现了,你无法设置test.Data=xxx,因为它只有get没有set,即只读。也无法访问data,这已经达到了保护的目的。如果你想实现内部元素也不能修改,那可以使用ReadOnly关键字修饰data,或重写数组以实现私有元素。另外.net自带ReadOnlyCollection<T> 类
http://msdn.microsoft.com/zh-cn/library/ms132474(v=VS.95).aspx
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式