2011-02-11 18 views
8

Yani aslında argümanlar göndermiyorum, ancak belirli bir değere bir sınıf değişkeni ayarlamıyorum, sonra başka bir yöntemde tekrar kullanıyorum. Bu, işleri yapmak için "en iyi uygulama" yolu mu? Değilse, doğru yolu öğrenmekle ilgilenirim. Teşekkürler! Argümanlar başka yoldan gönderilebilir mi? Bu çok sorunu çözmek için bu dile tanıtıldıOlay İşleyici Üzerinden Argümanlar Gönderme?

cevap

10

Closures. Uygun değişkeni ele geçirerek

, sen içeren yöntemi 'outlives' ki bu, onun depolama verebilir:

// Note that the 'input' variable is captured by the lambda. 
pd.PrintPage += (sender, e) => Print(e.Graphics, input); 
... 

static void Print(Graphics g, string input) { ... } 

bu çok bir kolaylık özelliği edin; Derleyicinin sizin adınıza bu sorunu çözme biçimi, kendi çözümünüze kuşkuyla benzer. (Örneğin, yakalanan değişken bazı diğer (oluşturulan) sınıfının yeni oluşturulmuş bir nesnesi olarak sona erer. Mevcut çözümünüz bunu yapmaz: tek 'geçici' depolama konumu başına iyi değil daha ziyadePrintIt için arama başına daha sınıfın örneği, - bu normalde) örneğin

+0

, sadece e yerine argüman e.Graphics göndermek için daha iyidir? Yoksa gerçekten büyük bir anlaşma değil mi? – sooprise

+0

@sooprise: Bu size kalmış - Tüm 'PrintPageEventArgs' gerektirmeyeceğini düşündüm, bu yüzden sadece ihtiyacını ona verelim. Özür dilerim, belki de o 'refactoring' işlemini yapmamalıydım; asıl konudan uzaklaşır. – Ani

+0

Kapatma hakkında başka bir sorum var. Sadece OP'de kodumun yanlış olduğu ortaya çıktı. "pd" değişkeni aslında "PrintIt" ve "PrintDocument_PrintSomething" öğelerinde kullanılan özel bir sınıf değişkenidir. "Pd" de "giriş" gibi bir argüman olarak geçmelidir (iki yöntem dışında tanımlandığı ve her ikisinin de kullandığı için)? – sooprise

1

-parçacığı güvenli değil, ama) bu API (WinForms baskı için o zamanki yaklaşımdır .

PrintThis'in yalnızca bir değişken değil, "modeliniz" veya "belgeniz" olduğunu göz önünde bulundurun.

0

Alternatif olarak, devralma kullanabilirsiniz: Baskı yönteminde

class MyPrintDocument : PrintDocument 
{ 
    public delegate void MyPrintPageEventHandler (object, PrintPageEventArgs, object); // added context! 
    public event MyPrintPageEventHandler MyPrintPageEvent; 

    public MyPrintDocument (object context) { m_context = context; } 
    protected void OnPrintPage (PrintPageEventArgs args) 
    { 
    // raise my version of PrintPageEventHandler with added m_context 
    MyPrintPageEvent (this, args, m_context); 
    } 
    object m_context; 
} 

public void PrintIt(string input) 
{ 
    MyPrintDocument pd = new MyPrintDocument(input); 
    pd.MyPrintPage += new MyPrintPageEventHandler (PrintDocument_PrintSomething); 
    pd.Print(); 
} 

private void PrintDocument_PrintSomething(Object sender, PrintPageEventArgs e, object context) 
{ 
    e.Graphics.DrawString((string) context, new Font("Courier New", 12), Brushes.Black, 0, 0); 
} 
+0

miras mı "Daha iyi uygulama" (kapatma ile karşılaştırıldığında?) – sooprise

+0

@sooprise: Bu C#, tüm sürümlerinde çalışır kapanır yeni bir giriş (3.5?). "Daha İyi Uygulama" için, söylemek zor. – Skizz

+0

Teşekkürler, bu yardımcı olur – sooprise

İlgili konular