Olaylara giriş

Geri

Olaylar, temsilciler gibi geç bağlama mekanizmasıdır. Aslında olaylar, temsilciler için dil desteğine göre oluşturulur.

Olaylar, bir nesnenin (sistemdeki tüm ilgili bileşenlere) bir şey olduğunu yayınlamasının bir yoludur. Başka herhangi bir bileşen olaya abone olabilir ve bir olay tetiklendiğinde bildirim alabilir.

Büyük olasılıkla bazı programlamalarınızda olayları kullanmışsınızdır. Birçok grafik sistemi, kullanıcı etkileşimlerini raporlamak için bir olay modeline sahiptir. Bu olaylar fare hareketini, düğme basmalarını ve benzer etkileşimleri rapor eder. Bu en yaygın senaryolardan biridir, ancak kesinlikle olayların kullanıldığı tek senaryo değildir.

Sınıflarınız için tetiklenmesi gereken olayları tanımlayabilirsiniz. Olaylarla çalışırken dikkat edilmesi gereken önemli noktalardan biri, belirli bir olay için kaydedilmiş herhangi bir nesne olmamasıdır. Hiçbir dinleyici yapılandırılmadığında olayları tetiklememesi için kodunuzu yazmanız gerekir.

Bir olaya abone olmak, iki nesne (olay kaynağı ve olay havuzu) arasında da bir bağlantı oluşturur. Artık olaylarla ilgilenmediğinde olay havuzu aboneliğinin olay kaynağından kaldırıldığından emin olmanız gerekir.

Etkinlik desteği için tasarım hedefleri

Olayların dil tasarımı şu hedefleri hedefler:

  • Bir olay kaynağı ile olay havuzu arasında çok az eşlemeyi etkinleştirin. Bu iki bileşen aynı kuruluş tarafından yazılamayabilir ve hatta tamamen farklı zamanlamalarla güncelleştirilebilir.

  • Bir olaya abone olmak ve aynı olayın aboneliğini kaldırmak çok basit olmalıdır.

  • Olay kaynakları birden çok olay abonesi desteklemelidir. Ayrıca olay abonelerinin eklenmemesi de desteklenmelidir.

Etkinliklerin hedeflerinin temsilcilerin hedeflerine çok benzediğini görebilirsiniz. Bu nedenle olay dili desteği temsilci dil desteğine göre oluşturulur.

Olaylar için dil desteği

Olayları tanımlama ve olaylara abone olma veya abonelikten çıkarma söz dizimi, temsilciler için söz diziminin bir uzantısıdır.

Bir olayı tanımlamak için anahtar sözcüğünü event kullanırsınız:

public event EventHandler<FileListArgs> Progress;

Olayın türü (EventHandler<FileListArgs> bu örnekte) bir temsilci türü olmalıdır. Bir olayı bildirirken izlemeniz gereken bir dizi kural vardır. Genellikle, olay temsilcisi türü geçersiz bir dönüşe sahiptir. Olay bildirimleri bir fiil veya fiil tümceciği olmalıdır. Olay gerçekleşen bir şeyi bildirdiğinde geçmiş zaman kullanın. Gerçekleşmek üzere olan bir şeyi bildirmek için mevcut bir zaman fiilini (örneğin, Closing) kullanın. Çoğu zaman, mevcut zaman kullanmak sınıfınızın bir tür özelleştirme davranışını desteklediğini gösterir. En yaygın senaryolardan biri iptali desteklemektir. Örneğin, bir Closing olay kapatma işleminin devam etmesi gerekip gerekmediğini belirten bir bağımsız değişken içerebilir. Diğer senaryolar, çağıranların olay bağımsız değişkenlerinin özelliklerini güncelleştirerek davranışı değiştirmesine olanak sağlayabilir. Bir algoritmanın gerçekleştireceği önerilen bir sonraki eylemi göstermek için bir olay tetikleyebilirsiniz. Olay işleyicisi, olay bağımsız değişkeninin özelliklerini değiştirerek farklı bir eylemi zorunlu kılabilir.

Olayı yükseltmek istediğinizde, temsilci çağırma söz dizimini kullanarak olay işleyicilerini çağırırsınız:

Progress?.Invoke(this, new FileListArgs(file));

Temsilciler bölümünde açıklandığı gibi? işleci, bu olaya abone olmadığında olayı tetiklemeye çalışmadığınızdan emin olunmasını kolaylaştırır.

Şu işlecini kullanarak += bir olaya abone olabilirsiniz:

EventHandler<FileListArgs> onProgress = (sender, eventArgs) =>
    Console.WriteLine(eventArgs.FoundFile);

fileLister.Progress += onProgress;

İşleyici yöntemi genellikle yukarıda gösterildiği gibi 'Açık' ön ekini ve ardından olay adını ekler.

Şu işleci kullanarak -= aboneliğinizi kaldırabilirsiniz:

fileLister.Progress -= onProgress;

Olay işleyicisini temsil eden ifade için yerel bir değişken bildirmeniz önemlidir. Bu, aboneliği kaldırmanın işleyiciyi kaldırmasını sağlar. Bunun yerine lambda ifadesinin gövdesini kullandıysanız, hiçbir şey yapmayan, hiç iliştirilmemiş bir işleyiciyi kaldırmaya çalışıyorsunuz.

Sonraki makalede, bu örnekte tipik olay desenleri ve farklı çeşitlemeler hakkında daha fazla bilgi edineceksiniz.

İleri