Acara dan perwakilan

Nota

Kumpulan minat komuniti kini telah berpindah daripada Yammer kepada Microsoft Viva Engage. Untuk menyertai komuniti Viva Engage dan mengambil bahagian dalam perbincangan terkini, isi borang Minta akses kepada Kewangan dan Operasi Viva Engage Komuniti dan pilih komuniti yang anda mahu sertai.

Artikel ini menerangkan istilah peristiwa dan kata kunci dalam X++.

Gunakan corak reka bentuk acara untuk menjadikan kod anda lebih modular dan boleh digunakan semula. Istilah acara ialah metafora yang menerangkan cara perwakilan digunakan. Apabila sesuatu yang penting berlaku semasa program dijalankan, modul lain mungkin perlu memproses kejadian tersebut. Kejadian penting ini dikenali sebagai peristiwa. Apabila peristiwa berlaku, program memberitahu pemberitahunya untuk acara itu bahawa pemberitahuan mesti menghantar pemberitahuan tentang peristiwa tersebut. Pemberitahuan menghantar pemberitahuan kepada semua pengendali peristiwa yang merupakan pelanggan pemberitahuan. Apabila program memberitahu pemberitahunya untuk menghantar pemberitahuan, proses itu menimbulkan peristiwa.

Anda boleh mentakrifkan perwakilan dalam jadual, borang atau pertanyaan dan bukan hanya dalam kelas.

Jadual berikut menunjukkan istilah yang menerangkan metafora peristiwa.

Istilah Description
Peristiwa Kejadian penting dalam modul program di mana modul tambahan mesti memproses kejadian.
Pemberitahuan Elemen program yang menghantar maklumat tentang peristiwa kepada semua pengendali peristiwa yang dilanggan kepada pemberitahu.
Pelanggan Program berfungsi atau kaedah yang dilanggan kepada pemberitahuan acara.
Pengendali acara Kaedah yang melanggan pemberitahuan acara. Hanya jenis kaedah yang sesuai boleh menjadi pengendali acara.

Kata kunci yang digunakan untuk pengaturcaraan yang menggunakan perwakilan

Jadual berikut menunjukkan kata kunci yang menerangkan penggunaan perwakilan.

Kata kunci atau istilah Kod Description
Wakil delegate myDelegate(str information) {} Kod menunjukkan rupa perwakilan dalam editor kod. Oleh kerana jenis pulangan sentiasa tidak sah, ia tidak disebut dalam sintaks. Tiada kod dibenarkan di dalam pendakap{} ().
Pengendali acara myClassInstance.myDelegate += eventHandler(otherClass.myInstanceMethod); Walaupun sintaks kata kunci eventHandler mungkin memberi gambaran bahawa eventHandler ialah fungsi X++, ia bukan fungsi. Kata kunci eventHandler memberitahu pengkompil bahawa kaedah sedang dilanggan kepada perwakilan.
Langgan atau tambah kaedah kepada perwakilan myClassInstance.myDelegate += eventHandler(OtherClass::aStaticMethod); Dalam kod, kaedah statik OtherClass::aStaticMethod menjadi melanggan kepada perwakilan.
Panggil perwakilan myClassInstance.myDelegate("Hello"); Panggilan kepada perwakilan ini menggesa perwakilan untuk memanggil setiap kaedah yang dilanggan kepada perwakilan. Kaedah yang dilanggan dipanggil dalam susunan yang sama di mana ia ditambah kepada perwakilan. Satu kaedah yang dilanggan mesti dilengkapkan sebelum perwakilan memanggil kaedah seterusnya.

Contoh

Contoh kod berikut menunjukkan cara mentakrifkan peristiwa, melanggan acara dan menaikkan acara dengan menggunakan dua kelas. Kelas PointWithEvent mentakrifkan perwakilan, dipindahkan. Kaedah pemindahan memanggil perwakilan yang dipindahkan , yang memberitahu sebarang objek yang melanggan peristiwa. Kelas PointKeeper mentakrifkan kaedah writeMove dan memperuntukkannya sebagai pengendali peristiwa untuk perwakilan yang dipindahkan bagi tika Point yang dicipta dalam kaedah createAndMove .

class PointWithEvent
{
    // Instance fields.
    real x;
    real y;

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    {
        x = _x;
        y = _y;
    }

    void move(real x_offset, real y_offset)
    {
        x += x_offset;
        y += y_offset;
        this.moved(abs(x_offset) + abs(y_offset));
    }

    delegate void moved(real distance)
    {
    }

}

class PointKeeper
{

    public void createAndMove()
    {
        PointWithEvent point = new PointWithEvent(1.0, 2.0);

        point.moved += eventhandler(this.writeMove);

        point.move(4.0, 5.0);
        // Output is "9.0".
    }

    public void writeMove(real distance)
    {
        info(any2Str(distance));
    }

}

Pengendali acara dan kaedah pra/pos

Dalam X++ warisan, anda boleh menetapkan dalam metadata bahawa kaedah tertentu dilaksanakan sebelum dan selepas pelaksanaan kaedah. Penerbit merekodkan maklumat tentang panggilan langganan, yang tidak berguna dalam persekitaran. Anda kini boleh menyediakan pengendali pra dan pos melalui kod dengan menyediakan atribut SubscribesTo pada pelanggan.

Contoh kaedah pra dan pasca

[PreHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PreHandler(XppPrePostArgs arguments)
{
    int arg = arguments.getArg("i");
}

[PostHandlerFor(classStr(MyClass2), methodstr(MyClass2, publisher))]
public static void PostHandler(XppPrePostArgs arguments)
{
    int arg = arguments.getArg("i");
    int retvalFromMethod = arguments.getReturnValue();
}

public int Publisher(int i)
{
    return 1;
}

Contoh ini menunjukkan kaedah penerbitan yang dipanggil Penerbit. Dua pelanggan disenaraikan dengan menggunakan atribut PreHandlerFor dan PostHandlerFor. Kod menunjukkan cara mengakses pembolehubah dan nilai kembali.

Ciri ini disediakan untuk keserasian ke belakang dan, kerana kod aplikasi tidak mempunyai banyak perwakilan, untuk menerbitkan peristiwa aplikasi penting. Pengendali pra dan pasca boleh pecah dengan mudah akibat daripada parameter yang ditambah atau dialih keluar, jenis parameter yang diubah atau kerana kaedah tidak lagi dipanggil atau dipanggil dalam keadaan yang berbeza. Atribut juga digunakan untuk mengikat pengendali peristiwa kepada perwakilan:

[SubscribesTo(
    classstr(FMRentalCheckoutProcessor),
    delegatestr(FMRentalCheckoutProcessor, RentalTransactionAboutTobeFinalizedEvent))]
public static void RentalFinalizedEventHandler(
    FMRental rentalrecord, Struct rentalConfirmation)
{
}

    delegate void RentalTransactionAboutTobeFinalizedEvent(
        FMRental fmrentalrecord, struct RentalConfirmation)
{
}

Dalam kes ini, atribut SubscribesTo menentukan bahawa kaedah RentalFinalizedEventHandler hendaklah dipanggil apabila perwakilan FmRentalCheckoutProcessor.RentalTransactionAboutToBeFinalizedEvent dipanggil. Oleh kerana pengikatan antara penerbit dan pelanggan dilakukan melalui atribut, anda tidak boleh menentukan urutan di mana pelanggan dipanggil.