2013-05-08 4 views
1

РИСКОВАННАЯ: В приведенном ниже примере немного надуманным, но я стараюсь, чтобы узнать о Делегаты и События в C#.Использование Делегаты и события с ArrayLists в C#

Код ниже состоит из двух классов: класс MyClass содержит ArrayList как свойство, член делегата и член обработчика событий. MainClass имеет две функции: main() и функция, которую вызывает делегат, вызываемый theHandler.

Мое намерение, когда я .Add к ArrayList реализованного в объекте MyClass: ClassObj в сделай то время как цикл, обработчик событий вызывает theHandler функции и записывает в консоль, что было добавлено. Однако он не вызывает функцию 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()); 
     } 
    } 
} 

Я думаю, что это имеет какое-то отношение ArrayLists используются как свойства класса, но я не уверен.

+4

Как ArrayList даже в вашем словаре .Net больше? –

+1

Не используйте ArrayList. Вы должны использовать общие коллекции, такие как «Список ». – SLaks

+0

@AustinSalonen Хех, поскольку мой словарный запас сейчас всего несколько дней, может быть, я смогу получить пропуск на этот раз. Спасибо, хотя, теперь я знаю, что ArrayLists отменены. –

ответ

1

проблема в том, что Tne 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 класс. Это позволяет вам настроить обработчик, который автоматически вызывается при изменении списка.

+0

Благодарим вас за руководство, ObservableCollections станет моей следующей остановкой. –

0

Ваше событие будет срабатывать только тогда, когда вы устанавливаете свойство с некоторым новым значением

ClassObj.arrayVal = new ArrayList() 

Следующая строка не будет вызывать set - но будем называть get вместо этого.

ClassObj.arrayVal.Add(str); 
+0

Спасибо, сэр или мадам, что и вправду. Теперь, когда я узнал об этом, я думаю, что больше никогда не буду использовать ArrayList, но представьте, что дженерики действуют аналогично в этом контексте? –