2009-07-13 7 views
9
bir olay tanımı için daha iyi bir çözümdür Ne

:C# Aksiyon/Delege Stil Soru

public event Action<object, double> OnNumberChanged; 

veya

public delegate void DNumberChanged(object sender, double number); 
public event DNumberChanged OnNumberChanged; 

ilk

az yazar alır, ama temsilci bir parametrelere isimlerini verir. Bunu yazarken, bence 2 numara kazanıyor, ama yanılıyor olabilirim.

Düzenleme: Farklı (üçüncü) bir yaklaşım kazanır. Alttarafı oku.

+1

, EventHandler kullanımı netlik için en iyisidir

Bir sınıf var. onun değerinde, sana Eylem ve tersi EventHandler kullanımlarını dönüştürmek sağlayacak Codeplex barındırılan bir kütüphane korumak Ne için . Daha fazla bilgi için bkz. Http://jolt.codeplex.com/Wiki/View.aspx?title=Jolt.Functional. –

+0

@Brad Bruce, yanıt dizisine değil, orijinal 2 fikrinden farklı üçüncü bir tekniğe atıfta bulunuyor. Soruyu yeniden yanıtladı ve cevabın daha açık olması için birazcık kabul ettim. – Aardvark

cevap

16

Ne 1 veya 2. Üçüncü bir seçenek kazanan

public event EventHandler<NumberChangedEventArgs> NumberChanged; 

Böyle EventArgs kapsamaz olay args için bir tür kullanmak gibi C# geliştirmek için stil kurallar bir dizi kırıyorsun olduğunu .

Evet, derleyicinin umurunda olmadığı gibi bunu yapabilirsiniz. Ancak, kodunuzu okuyan insanlar bir WTF yapacaklar.

+0

+1. Bu özelliğin EventArgs özelliğini, özellik değişikliği bildirimi olayı için gerekmeyebileceğini eklemek istiyorum, çünkü değişiklik zaten gönderenin özelliğinden yansıtılmış olmalıdır. – tia

11

Yapmanız gerekmiyorsa yeni bir tür oluşturmayın. Bunun daha iyi olduğunu düşünüyorum:

public event Action<object, double> OnNumberChanged; 

Action ve Func temsilci aileleri var olduğunu sebebi bu çok amaçlı hizmet etmek ve geliştiriciler tarafından yeni temsilci tipi yaratılması ihtiyacını azaltmaktır.

+0

Bunu sürdürmek için bir tane daha az kod satırıyla katılıyorum. –

0

Seçenek 1'i seçtiğimde daha iyi olacağını düşünüyorum, ancak IIRC, olayların resmi yönergeleri, ikinci parametrenizin XxxEventArgs adıyla bir sınıf olması gerektiğini ve miras zincirinde EventArgs olmalıdır.

+1

Evet haklısınız. Ayrıca, etkinliği "Açık" adıyla başlatmamanızı da tavsiye ederler, ancak bunu, etkinliğinizi yükseltmek için kullanılan korumalı yöntem için ayırırsınız.Stil yönergeleri referansı için –

1

Kodlama stili ile ilgili tüm sorularda olduğu gibi. Tercih ettiğiniz birini seçin veya takımınızın tercih ettiğini ve proje boyunca tutarlı olmasını sağlayın. İhtiyacı olan herkes bunu okuyabildiği sürece iyi olacaksın.

2

Genellikle argüman olarak bir EventArgs türetilmiş sınıfını kullanmaya devam ediyorum. Kodu daha tutarlı hale getirir.

public class ApplyClickedEventArgs : EventArgs 
{ 
    ... 
} 

ve bir işleyici:

void cpy_ApplyClicked(object sender, ApplyClickedEventArgs e) 
{ 
    ... 
} 

beyanıdır: Aşağıda belirtildiği gibi

public event EventHandler<ApplyClickedEventArgs> ApplyClicked;