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());
        }
    }
}

我的猜测是,它有一些东西与数组列表被用作类属性,但我不确定。

c#中在数组列表中使用委托和事件

问题是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);