คลาส c# สมัครสมาชิกกิจกรรมของกันและกัน

คลาส เอ มีงานกิจกรรม คลาส B ต้องการสมัครสมาชิก คลาส B มีกิจกรรมและคลาส A ต้องการสมัครเข้าร่วม

ฉันพยายามโดยการสร้างวัตถุของคลาส B ใน A และคลาส A ใน B แต่มันเกิดการหยุดชะงัก

ฉันต้องการความช่วยเหลือที่นี่...

โปรดตรวจสอบภาพนี้

สี่เหลี่ยมสีเทาต้องเป็นเหตุการณ์ ลูกศรบ่งชี้ว่าเหตุการณ์จะต้องถูกยกขึ้นจากชั้นเรียนหนึ่งไปอีกชั้นเรียนหนึ่ง

class A
{
B b;
public event EventHandler eventA;

OnEventA()
{
eventA();
}

public A()
{
b= new B();
b.eventB += DoSomethingElse();
}

}


class B
{
A a;
public B()
{
    a= new A();
    a.eventA += DoSomething();
}
public event EventHandler eventB;

OnEventB()
{
eventB();
}


}

person Anu    schedule 10.07.2017    source แหล่งที่มา
comment
ข้อเท็จจริงที่คุณกำลังลองสิ่งนี้บ่งชี้ว่ามีปัญหาในการออกแบบ โปรดให้บริบทเพิ่มเติมเล็กน้อยเกี่ยวกับปัญหาเพื่อให้เราสามารถช่วยเหลือคุณได้!   -  person Bas    schedule 10.07.2017
comment
ฉันแก้ไขคำถาม คุณสามารถช่วยฉันได้ไหม?   -  person Anu    schedule 10.07.2017
comment
ทำไมคุณถึงคิดว่ามีการหยุดชะงัก? สิ่งนี้ไม่ควรทำให้เกิดการหยุดชะงัก   -  person CodingYoshi    schedule 10.07.2017
comment
ฉันอัปเดตอีกครั้งด้วยรหัสที่ฉันลอง   -  person Anu    schedule 10.07.2017
comment
คำถามที่ถูกต้องสมบูรณ์แบบพร้อมโค้ดและไดอะแกรม โหวตลง 2 ครั้งและโหวตปิด เกิดอะไรขึ้นกับเว็บไซต์นี้...   -  person CodingYoshi    schedule 10.07.2017
comment
@CodingYoshi การแก้ไขโพสต์ครั้งแรกของ OP ไม่มีรหัสหรือไดอะแกรมใด ๆ ดังนั้นจึงอธิบายว่าทำไมจึงมี 2 DVs และการโหวตอย่างใกล้ชิด   -  person Tetsuya Yamamoto    schedule 10.07.2017
comment
@anu - รหัสจริงคงจะดี รหัสของคุณไม่ได้รวบรวม   -  person Enigmativity    schedule 10.07.2017


คำตอบ (2)


นี่คือรหัสที่คุณต้องการ:

class A
{
    B b;
    public event EventHandler eventA;

    void OnEventA()
    {
        var ea = this.eventA;
        if (ea != null)
        {
            ea(this, new EventArgs());
        }
    }

    public A()
    {
        this.b = new B(this);
        this.b.eventB += DoSomethingElse;
    }

    private void DoSomethingElse(object sender, EventArgs e)
    {
    }
}

class B
{
    A a;
    public B(A a)
    {
        this.a = a;
        this.a.eventA += DoSomething;
    }
    public event EventHandler eventB;

    void OnEventB()
    {
        var eb = this.eventB;
        if (eb != null)
        {
            eb(this, new EventArgs());
        }       
    }

    private void DoSomething(object sender, EventArgs e)
    {
    }   
}
person Enigmativity    schedule 10.07.2017
comment
คุณบันทึกวันของฉัน ฉันลืมแนวคิดของตัวสร้างพารามิเตอร์ไปโดยสิ้นเชิง ขอบคุณมากมาย :) - person Anu; 10.07.2017

สมมติว่าปัญหาของคุณคือคุณไม่มีสถานการณ์ที่เหมาะสมในการพูดคุยกัน ต่อไปนี้เป็นแนวทางหนึ่งที่อาจช่วยคุณได้:

ในตัวสร้างของคุณสำหรับประเภท A ให้สร้างอินสแตนซ์ประเภท B และตั้งค่าการอ้างอิงไปยังอินสแตนซ์ปัจจุบันของคุณที่ A (this)

public A()
{
    // give B reference to A
    b = new B(this);
    // subscribe A to B's event
    b.eventB += DoSomethingElse();
}

เพื่อให้สิ่งนี้ทำงานได้ คุณจะต้องมีตัวสร้างประเภท B ยอมรับการอ้างอิงถึง A ดังนี้:

public B(A a)
{
    // subscribe B to A's event
    a.eventA += DoSomething();
}

คุณอาจต้องการอ่านรายละเอียดการยกเลิกการสมัครกิจกรรมเพื่อให้แน่ใจว่าคุณได้เผยแพร่ทรัพยากรอย่างถูกต้อง ตรวจสอบลิงค์เหล่านี้:

แนวทางปฏิบัติที่ดีที่สุดในการล้างข้อมูลอ้างอิงตัวจัดการเหตุการณ์คืออะไร

ฉันควรยกเลิกการเชื่อมต่อตัวจัดการเหตุการณ์ในเมธอด Dispose เสมอหรือไม่< /ก>

person dnickless    schedule 10.07.2017