首页 新闻 会员 周边

c# 集合属性应该怎么搞比较好

0
悬赏园豆:10 [已解决问题] 解决于 2011-12-22 18:26

比如我一个类里 定义了一个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、在自定义集合中作索引器。

为森的主页 为森 | 小虾三级 | 园豆:579
提问于:2011-12-11 01:30
< >
分享
最佳答案
0
 //不想让外部类修改的属性,你可以只有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("被外部类修改了");
}
收获园豆:10
LCM | 大侠五级 |园豆:6876 | 2011-12-11 10:50

用您的方法 只能确保mypro 不被整体的修改引用,但是外部可以这样 myclass.mypro[0]="cc";这样修改是拦不住的,也不能得到提示。

为森 | 园豆:579 (小虾三级) | 2011-12-11 23:16
其他回答(2)
0

第一个问题:要么把public访问修饰符改一下,要么编程只读的属性。

第二个问题:在set的时候判断一下是否与本类的设置的值相同。

悟行 | 园豆:12559 (专家六级) | 2011-12-11 10:27

用您的方法 只能确保mypro 不被整体的修改引用,但是外部可以这样 myclass.mypro[0]="cc";这样修改是拦不住的,也不能得到提示。

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2011-12-11 23:17
0

这里提供一个方法:

        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();
胡屯 | 园豆:714 (小虾三级) | 2011-12-11 11:43

ok,非常感谢,但是第二个问题如何解决?

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2011-12-11 23:17

还有假如List<string> 是List<classb>这个时候即使AsReadOnly好像也是无效的,无法阻拦修改这样的修改 classA.mypro[0].classBpro="**";

支持(0) 反对(0) 为森 | 园豆:579 (小虾三级) | 2011-12-11 23:26

@文楚: SetPro,AddItem这两种方法供外部修改对象内部需求。

支持(0) 反对(0) 胡屯 | 园豆:714 (小虾三级) | 2011-12-12 09:03

@文楚: classA.mypro[0].classBpro="**"; 我没有试过。

如果存在这种情况,那只好不让外部直接获取List<classb>对象引用了,然后定义operator [],或者提供一个类似的接口 GetItemByIndex(index),返回只读Item对象的引用。

支持(0) 反对(0) 胡屯 | 园豆:714 (小虾三级) | 2011-12-12 09:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册