比如我一个类里 定义了一个List<string>的属性
比如:
public List<string> mypro
{
get{return _mypro;}
prviate set{_mypro=value}
}
我的问题是
1、即使这样 外部的类仍然可以修改mypro里的内容。怎么可以防止修改呢?
2、现在要求变了允许其他类修改内容,但是本类如何获知呢?
是不是我这想法本来就是错的需要其他思路?现在很迷茫,求解答。
谢谢三楼的答案第一个问题算是解决,但是第二个如何去做?
还有假如List<string> 是List<classb>这个时候即使AsReadOnly好像也是无效的。
在这里结贴,其实这种问题是应该这样去思考:
1、自己定义集合类最好继承:IEnumable<>接口,那么这样就可以用foreach等迭代你的集合了,也能用LINQ等。
2、在自定义集合中作索引器。
//不想让外部类修改的属性,你可以只有get没有set啊,如下
private List<string> _mypro;
public List<string> mypro
{
get { return _mypro; }
}
//或者用2.0的语法这样写
public List<string> mypro1 { get; private set; }
//如果你允许其他类修改,但是本类要知道外部类修改了,可以如下,
//在本类中修改 _mypro2字段,在外部类修改mypro2属性
private List<string> _mypro2;
public List<string> mypro2
{
get { return _mypro2; }
set
{
mypro2Changed();
_mypro2 =value;
}
}
private void mypro2Changed()
{
Console.WriteLine("被外部类修改了");
}
用您的方法 只能确保mypro 不被整体的修改引用,但是外部可以这样 myclass.mypro[0]="cc";这样修改是拦不住的,也不能得到提示。
第一个问题:要么把public访问修饰符改一下,要么编程只读的属性。
第二个问题:在set的时候判断一下是否与本类的设置的值相同。
用您的方法 只能确保mypro 不被整体的修改引用,但是外部可以这样 myclass.mypro[0]="cc";这样修改是拦不住的,也不能得到提示。
这里提供一个方法:
private List<string> _mypro;
public IList<string> mypro
{
get { return _mypro.AsReadOnly(); }
}
public void SetPro(List<string> value)
{
_mypro = value;
ChangeNotify();
}
public void AddItem(string item)
{
_mypro.Add(item);
ChangeNotify();
}
这里是AsReadOnly声明
public ReadOnlyCollection<T> AsReadOnly();
ok,非常感谢,但是第二个问题如何解决?
还有假如List<string> 是List<classb>这个时候即使AsReadOnly好像也是无效的,无法阻拦修改这样的修改 classA.mypro[0].classBpro="**";
@文楚: SetPro,AddItem这两种方法供外部修改对象内部需求。
@文楚: classA.mypro[0].classBpro="**"; 我没有试过。
如果存在这种情况,那只好不让外部直接获取List<classb>对象引用了,然后定义operator [],或者提供一个类似的接口 GetItemByIndex(index),返回只读Item对象的引用。