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,属性的保护功能是不是被突破了?? 展开
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,属性的保护功能是不是被突破了?? 展开
展开全部
也许你有点混淆概念了。上面的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
http://msdn.microsoft.com/zh-cn/library/ms132474(v=VS.95).aspx
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询