.NET 4.x Делегаты - C#
Формулировка задачи:
Помогите разобраться:
1. Почему не выводит время на экран? это пример из учебника (Learn C# 3.0 O'REILLY Jesse Liberty, p.390), скопипастил вроде правильно - все перепроверил.
2. Зачем автор в сигнатуре делегата и в методах (TimeHasChanged, WriteLogEntry) указывает в качестве входного параметра object theClock (в указанных функциях он не используется и в метод Subcribe передается отдельно)?
3. Почему он указывает тип object, а не - Clock?
4. Без вышеуказанного входного параметра код будет работать?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ClockDelegate
{
public class TimeInfoEventArgs: EventArgs
{
public int hour;
public int minute;
public int second;
public TimeInfoEventArgs(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
}
public class Clock
{
private int hour;
private int minute;
private int second;
public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs timeInformation);
public SecondChangeHandler SecondChanged;
public void Run()
{
for (;;)
{
Thread.Sleep(100);
System.DateTime dt = new System.DateTime();
if (dt.Second != second)
{
TimeInfoEventArgs timeInformation = new TimeInfoEventArgs(dt.Hour, dt.Minute, dt.Second);
if (SecondChanged != null) { SecondChanged(this, timeInformation); }
}
this.hour = dt.Hour;
this.minute = dt.Minute;
this.second = dt.Second;
}
}
}
public class DisplayClock
{
public void TimeHasChanged(object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine("Current time: \t{0}:{1}:{2}", ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
}
public void Subscribe(Clock theClock)
{
theClock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);
}
}
public class LogCurrentTime
{
public void WriteLogEntry(object theClock, TimeInfoEventArgs ti)
{
Console.WriteLine("Logging to file: {0}:{1}:{2}", ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
}
public void Subscribe(Clock theClock)
{
theClock.SecondChanged += new Clock.SecondChangeHandler(WriteLogEntry);
}
}
public class Tester
{
public void Run()
{
Clock theClock = new Clock();
DisplayClock dc = new DisplayClock();
dc.Subscribe(theClock);
LogCurrentTime lct = new LogCurrentTime();
lct.Subscribe(theClock);
theClock.Run();
}
}
class Program
{
static void Main(string[] args)
{
Tester t = new Tester();
t.Run();
}
}
}Решение задачи: «.NET 4.x Делегаты»
textual
Листинг программы
System.DateTime dt = System.DateTime.Now;