Aracılığıyla paylaş


Olaylara giriş

Önceki

Olaylar, temsilciler gibi, bir geç bağlama mekanizması olarak işlev görü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 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 en az eşlemeyi etkinleştirin. Bu iki bileşen farklı kuruluşlar tarafından yazılabilir ve hatta farklı zamanlamalarda güncelleştirilebilir.
  • Bir olaya abone olmak ve aynı olayın aboneliğini kaldırmak basit olmalıdır.
  • Olay kaynakları birden çok etkinlik abonesini desteklemelidir. Ayrıca olay abonelerinin eklenmemesi de desteklenmelidir.

Etkinliklerin hedeflerinin, temsilcilerin hedeflerine benzer olduğunu 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 event anahtar sözcüğünü kullanırsınız:

public event EventHandler<FileFoundArgs>? FileFound;

Olayın türü (bu örnekteEventHandler<FileListArgs>) bir temsilci türü olmalıdır. Bir olayı bildirirken izlemeniz gereken kurallar 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 bildirirken geçmiş zaman kullanın. Gerçekleşmek üzere olan bir şeyi bildirmek için mevcut bir zaman fiil (ö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 event, kapatma işleminin devam edip etmeyeceğini belirten bir argüman içerebilir. Diğer senaryolar, çağıranların olay bağımsız değişkenlerinin özelliklerini güncelleştirerek davranışı değiştirmesine olanak tanır. Bir algoritmanın gerçekleştireceği önerilen bir sonraki eylemi göstermek için bir olay oluşturabilirsiniz. Olay işleyicisi, olay bağımsız değişkeninin özelliklerini değiştirerek farklı bir eylemi zorunlu kabilir.

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

FileFound?.Invoke(this, new FileFoundArgs(file));

temsilcileri 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.

+= işlecini kullanarak bir olaya abone olabilirsiniz:

var fileLister = new FileSearcher();
int filesFound = 0;

EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
    Console.WriteLine(eventArgs.FoundFile);
    filesFound++;
};

fileLister.FileFound += onFileFound;

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

-= işlecini kullanarak aboneliğinizi kaldırabilirsiniz:

fileLister.FileFound -= onFileFound;

Olay işleyicisini temsil eden ifade için yerel bir değişken bildirmeniz önemlidir. Abonelikten çıkma, işleyicinin kaldırılmasını sağlar. Bunun yerine lambda ifadesinin gövdesini kullandıysanız, hiçbir şey yapmayan, hiç bağlı olmayan bir işleyiciyi kaldırmaya çalışıyorsunuz demektir.

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

sonraki