c#中在数组列表中使用委托和事件
本文关键字:事件 数组 列表 | 更新日期: 2023-09-27 18:12:50
警告:下面的例子有点做作,但我正试图学习 c# 中的委托和事件。
下面的代码由两个类组成:MyClass类包含一个ArrayList作为属性、一个委托成员和事件处理程序成员。MainClass只有两个函数main()一个和委托调用的函数theHandler。
我的意图是当我在myClass对象中实例化的ArrayList中添加:ClassObj在do-while循环中事件处理程序调用handler函数并将已添加的内容写入控制台。然而,它似乎没有调用Handler函数。
我知道ArrayList正在更新,当我使用说(字符串)而不是ArrayList我能够得到委托/事件过程的工作。
public class myClass{
public delegate void classEventHandler(ArrayList anArray);
private ArrayList strArray = new ArrayList();
public event classEventHandler arrayChanged;
public ArrayList arrayVal{
get{
return strArray;
}
set{
this.strArray.Add(value);
this.arrayChanged(strArray);
}
}
}
class MainClass
{
public static void Main (string[] args)
{
myClass ClassObj = new myClass();
ClassObj.arrayChanged += theHandler;
string str;
do{
str = Console.ReadLine();
ClassObj.arrayVal.Add(str);
}while(!str.Equals("exit"));
Console.ReadLine();
}
public static void theHandler(ArrayList newArray){
foreach(object o in newArray){
Console.WriteLine("{0}", o.ToString());
}
}
}
我的猜测是,它有一些东西与数组列表被用作类属性,但我不确定。
问题是ClassObj.arrayVal.Add(str)
没有调用set
方法,因为它没有重新定义arrayVal
,它只是将另一个元素添加到数组中。您需要一个方法将元素添加到数组中,并触发事件:
public class myClass{
public delegate void classEventHandler(ArrayList anArray);
private ArrayList strArray = new ArrayList();
public event classEventHandler arrayChanged;
public void AddToArray(string value){
this.strArray.Add(value);
this.arrayChanged(strArray);
}
}
然后在循环中你这样调用它:
do{
str = Console.ReadLine();
ClassObj.AddToArray(str);
}while(!str.Equals("exit"));
您可能还想查看ObservableCollection类。它允许您设置一个处理程序,该处理程序在列表更改时自动调用
只有当你用新值设置属性时,事件才会被触发
ClassObj.arrayVal = new ArrayList()
下一行将不调用set
-而是调用get
。
ClassObj.arrayVal.Add(str);