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?
8
A
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
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);
}
İlgili konular
- 1. QDBus üzerinden gönderme gönderimi
- 2. NSOutputStream üzerinden UIImage gönderme
- 3. android üzerinden POST üzerinden ikili veri gönderme
- 4. jQuery.ajax() ve gönderme boole istek argümanlar
- 5. Komutları ADB Üzerinden Gönderme Android
- 6. İstek Gönderme Modeli/Eşzamanlı/Async/Olay Driven
- 7. Gönderme düğmesi için olay tetikleme sırası
- 8. 2 WPF penceresi arasında olay gönderme
- 9. Dinamik bir olay gönderme diyaloğu yapabilir miyim?
- 10. Bir asyncio olay döngüsüne iş gönderme
- 11. İşlemler aracılığıyla olay sinyali gönderme - C
- 12. Soketler üzerinden diziler gönderme ve alma
- 13. Amazon SES üzerinden posta gönderme nasıl hızlandırılır?
- 14. Amazon ses üzerinden HTML epostası gönderme
- 15. GWT - Aynı olay için birden fazla işleyici nasıl kullanılır
- 16. VB.NET'te programla oluşturulmuş bir nesne için nasıl olay işleyici oluştururum?
- 17. Esnek/actionscript'te argümanlar olay dinleyicisi işlevine nasıl geçirilir?
- 18. argümanlar
- 19. Javascript tetiklenen olay kullanarak bir HTTP Gönderi gönderme
- 20. İşleyici sınıf kodu tetiklenmiyor
- 21. Web.py işleyici sınıfları için bağımsız değişkenler
- 22. Yanıt Gönderme/Yeniden Gönderme formunda gönder
- 23. Bir olay işleyici ile çalışma - ama her zaman değil .. (Nasıl yaparım ...)
- 24. AngularJS - bir modülden diğerine olay gönderme; Gerçekten işe yarıyor mu?
- 25. Olay Gönderme makign olmadan Görüntü Rendering Konu bekleyin?
- 26. Öznitelik ayarlayıcısı SQL işlevi üzerinden değer gönderme nasıl
- 27. iPhone - bluetooth üzerinden görüntü ve metin gönderme hatası
- 28. PHP SMTP üzerinden E-Posta gönderme çok yavaş
- 29. Kovboy ve MessagePack ile web üzerinden ikili veri gönderme MessagePack
- 30. Groovy/Grails HTTP üzerinden HTTP gönderme (REST eklentisini kullanarak)
, 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
@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
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