Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中的事件和委托:如何使用事件&;学员通知一个班级另一个班级的变化_C#_Winforms_Console - Fatal编程技术网

c#中的事件和委托:如何使用事件&;学员通知一个班级另一个班级的变化

c#中的事件和委托:如何使用事件&;学员通知一个班级另一个班级的变化,c#,winforms,console,C#,Winforms,Console,下面的问题是如何正确使用事件和委托调用类的方法A:Show1()使用在B:Show()中提出的类B的事件 抱歉,有任何问题。这是我第一次使用stackoverflow。我想不出你想做什么,但为了回答你的问题,这可能就够了。除非我没有正确理解你的问题。 请注意,这违反了OOP原则,即每个类都应该独立于其他类 public class classA { public void show1() { Console.WriteLine("I am class A");

下面的问题是如何正确使用事件和委托调用类的方法
A:Show1()
使用在
B:Show()中提出的类B的事件


抱歉,有任何问题。这是我第一次使用stackoverflow。我想不出你想做什么,但为了回答你的问题,这可能就够了。除非我没有正确理解你的问题。
请注意,这违反了OOP原则,即每个类都应该独立于其他类

public class classA
{
    public void show1()
    {
        Console.WriteLine("I am class A");
    }
}

public class classB
{
    public void show()
    {
        new classA().show1(); 
        Console.WriteLine("I am class B");            
    }
}

我想不出你想要完成什么,但回答你的问题,这可能就够了。除非我没有正确理解你的问题。
请注意,这违反了OOP原则,即每个类都应该独立于其他类

public class classA
{
    public void show1()
    {
        Console.WriteLine("I am class A");
    }
}

public class classB
{
    public void show()
    {
        new classA().show1(); 
        Console.WriteLine("I am class B");            
    }
}

要从编辑的问题中获得结果,可以使用以下代码:

static void Main()
{
    classA obA = new classA();
    classB obB = new classB();
    obA.Shown += ( object sender, EventArgs e ) => { obB.ShowB(); };
    obA.ShowA();
}

public class classA
{
    public event EventHandler Shown;

    public classA()
    {
    }

    public void ShowA()
    {
        Console.WriteLine( "I am class A" );

        if( Shown != null )
            Shown( this, EventArgs.Empty );
    }
}

public class classB
{
    public event EventHandler Shown;

    public classB()
    {
    }

    public void ShowB()
    {
        Console.WriteLine( "I am class B" );

        if( Shown != null )
            Shown( this, EventArgs.Empty );
    }
}
main()

obB.Shown += ( object sender, EventArgs e ) => { obA.ShowA(); };
obB.ShowB();

但您不应同时执行这两项操作,否则您将得到一个无限循环,最终导致堆栈溢出

要从编辑的问题中获得结果,您可以使用以下代码:

static void Main()
{
    classA obA = new classA();
    classB obB = new classB();
    obA.Shown += ( object sender, EventArgs e ) => { obB.ShowB(); };
    obA.ShowA();
}

public class classA
{
    public event EventHandler Shown;

    public classA()
    {
    }

    public void ShowA()
    {
        Console.WriteLine( "I am class A" );

        if( Shown != null )
            Shown( this, EventArgs.Empty );
    }
}

public class classB
{
    public event EventHandler Shown;

    public classB()
    {
    }

    public void ShowB()
    {
        Console.WriteLine( "I am class B" );

        if( Shown != null )
            Shown( this, EventArgs.Empty );
    }
}
main()

obB.Shown += ( object sender, EventArgs e ) => { obA.ShowA(); };
obB.ShowB();

但是你不应该同时做这两件事,否则你会得到一个无限循环,最终导致堆栈溢出

我想这就是答案@GuidoG@Kai Thoma

class A
{
    public A(B b)
    {
        b.ShowA += new methcall(this.showA);
    }
    public void showA()
    {
        Console.WriteLine("I am Class A");
    }
}
class B
{
    public event methcall ShowA;
    public void showB()
    {
        Console.WriteLine("I am Class B");
        if (ShowA != null)
            ShowA();
    }
}
class Program
{
    static void Main()
    {
        B b = new B();
        A a = new A(b);
        methcall m = new methcall(b.showB);
        m.Invoke();
        Console.ReadKey();
    }
}

我猜这就是答案“GuidoG”Kai Thoma

class A
{
    public A(B b)
    {
        b.ShowA += new methcall(this.showA);
    }
    public void showA()
    {
        Console.WriteLine("I am Class A");
    }
}
class B
{
    public event methcall ShowA;
    public void showB()
    {
        Console.WriteLine("I am Class B");
        if (ShowA != null)
            ShowA();
    }
}
class Program
{
    static void Main()
    {
        B b = new B();
        A a = new A(b);
        methcall m = new methcall(b.showB);
        m.Invoke();
        Console.ReadKey();
    }
}


1) 抛出异常并引发事件。2) 是否要从B中声明的方法调用a中声明的方法而不使用类型a?如果要调用类的方法,则该方法必须是静态的,或者必须先创建该类的实例。甚至您上面的代码也在
\u Thrower=new classB()中创建了一个classB实例。对不起,我还不明白你想用这个活动筹款的东西做什么。也许您想创建一个匿名实例,比如
new classB().show()
?请查看我的编辑谢谢@NoëlWidmer1)抛出异常并引发事件。2) 是否要从B中声明的方法调用a中声明的方法而不使用类型a?如果要调用类的方法,则该方法必须是静态的,或者必须先创建该类的实例。甚至您上面的代码也在
\u Thrower=new classB()中创建了一个classB实例。对不起,我还不明白你想用这个活动筹款的东西做什么。也许您想创建一个匿名实例,如
new classB().show()
?请查看我的编辑Thanksys@NoëlWidmer,而不使用任何类a引用,而不是仅通过事件和代理的事件实例。您想从类调用方法而不创建该类吗?这是不可能的。定义类是毫无疑问的,我们应该定义两个类只要调用一个方法调用两个方法,第二个方法的调用应该在不使用classA的情况下完成意味着触发一个事件来调用其他类的方法你在这里想做什么?这对我来说毫无意义。如何从无法定义的内容调用方法?事件在这里没有帮助,因为事件还需要一个实例来订阅。如果你解释一下为什么需要这个,也许会有帮助问题是是否有类A:show1()和类B:show(),我必须调用show1()在类B中,不使用类A对象,使用委托和事件很抱歉,不使用任何类A引用,而不是仅通过事件和委托使用事件实例。您想在不创建该类的情况下从类调用方法吗?这是不可能的。定义类是毫无疑问的,我们应该定义两个类只要调用一个方法调用两个方法,第二个方法的调用应该在不使用classA的情况下完成意味着触发一个事件来调用其他类的方法你在这里想做什么?这对我来说毫无意义。如何从无法定义的内容调用方法?事件在这里没有帮助,因为事件还需要一个实例来订阅。如果你解释一下为什么需要这个,也许会有帮助问题是是否有类A:show1()和类B:show(),我必须调用类B中的show1(),而不使用类A对象使用委托和事件抱歉给你带来不便,请看我的答案,请看我的答案