C# 有没有更好的方法从另一个类获取信息?

C# 有没有更好的方法从另一个类获取信息?,c#,.net,C#,.net,我正在做一个项目,我想知道从一个班级到另一个班级获取信息的最佳方式 我的目的是从MyTimer向Program类获取有关计时器计时次数的信息 **我不希望MyTimer类依赖于Program类,就像使用Program.SetUpdate一样。MyTimer类应该在不更改代码的情况下与每个类一起工作 我已经尝试使用publicstatic方法发送信息 class Program { private static int _count; private static MyTimer

我正在做一个项目,我想知道从一个班级到另一个班级获取信息的最佳方式

我的目的是从MyTimer向Program类获取有关计时器计时次数的信息

**我不希望MyTimer类依赖于Program类,就像使用Program.SetUpdate一样。MyTimer类应该在不更改代码的情况下与每个类一起工作

我已经尝试使用publicstatic方法发送信息

class Program
{
    private static int _count;
    private static MyTimer _myTimer;

    static void Main(string[] args)
    {

        _count = 0;
        _myTimer = new MyTimer() { Timer_Interval = 100 };

        _myTimer.Start();

        do
        {
            Console.WriteLine("Press q to quit.");
        } while (Console.ReadKey().KeyChar.ToString().ToLower() != "q");

        _myTimer.Stop();
    }

    public static void SetUpdate(int count)
    {
        _count = count;

        Print();
    }

    private static void Print()
    {
        Console.WriteLine(_count);
    }
}

class MyTimer
{
    private Timer _timer;
    private int _ticks;

    public int Timer_Interval { get; set; }

    public MyTimer()
    {
        _timer = new Timer();
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Program.SetUpdate(_ticks);

        _ticks++;
    }

    public void Start()
    {
        if (Timer_Interval == 0)
            throw new InvalidOperationException("_timer interval can not be 0.");

        _ticks = 0;

        _timer.Interval = Timer_Interval;
        _timer.Start();
    }

    public void Stop()
    {
        _timer.Stop();
    }
}
输出为1,2,3。。。直到你按q/q

我试着尽可能简单地做这件事,只是为了向你们展示这个概念

所以我创建了一个名为Program的类,它调用MyTimer类。
MyTimer类就像一个计时器:停止、启动和运行。每个间隔都会打勾。

通常,您会通过确定方向来解决此类问题。在这里,从程序到我的计时器,感觉很自然。在给定的方向上,进行直接方法调用、访问属性等都是非常好的


当您需要信息向另一个方向流动时,即使用。MyTimer引发一个事件,程序可以有一个处理程序。通过这种方式,MyTimer不知道哪些类正在创建它/使用它,甚至不知道已经安装了多少事件处理程序。

我认为Damien在这种情况下基本上做到了这一点。 然而,我想提出另一种选择:使用共享状态对象

您可以定义一个State类,它只保存tick count的值

您可以在程序中实例化它并将其传递给MyTimer。请注意,这两个类现在共享同一个实例,如果在多线程上下文中,可能会引入线程/并发问题

然后MyTimer将更新共享对象的状态

例如MVVM/WPF中的Model/ViewModel类,您可以在其中将某些控件的属性绑定到该对象的属性

请注意,程序不会知道正在发生的变化。因此,这将不得不另外处理。或者再次通过事件、某种观察者模式或类似方式


正如我所说,事件是解决问题的方法,但我认为建议一种可供选择的类间交流方式不会有什么坏处。

好的,谢谢,我的第二个问题是:我希望MyTimer类是独立的,而不是使用Program类的方法。我怎样才能做到这一点?我想也许应该使用界面。这正是你在使用事件时所做的。MyTimer发布任何类都可以注册处理程序的事件。MyTimer完全不知道处理程序做什么。看看@user1473213,这正是这个答案所解决的问题。计时器不应调用程序上的方法。它应该调用一个事件,程序应该为这个事件注册一个监听器。