2011-02-11 60 views
8

所以我實際上並沒有發送參數,而是將一個類變量設置爲某個值,然後在另一個方法中再次使用它。這是做最好的做法嗎?如果沒有,我會有興趣學習正確的方法。謝謝!可以/應該以其他方式發送參數嗎?通過事件處理程序發送參數?

private string PrintThis; 

public void PrintIt(string input){ 
    PrintThis = input; //SETTING PrintThis HERE 
    static private PrintDocument pd = new PrintDocument(); 
    pd.PrintPage += new PrintPageEventHandler(PrintDocument_PrintSomething); 
    pd.Print(); 
} 
private void PrintDocument_PrintSomething(Object sender, PrintPageEventArgs e) { 
    e.Graphics.DrawString(PrintThis, new Font("Courier New", 12), Brushes.Black, 0, 0); 
    //USING PrintThis IN THE ABOVE LINE 
} 

回答

10

Closures被引入語言來解決這個問題。

通過捕捉合適的變量,你可以給它存儲的是「會超越」含有方法:

// 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) { ... } 

注意,這非常便利的功能;編譯器解決這個問題的方式與您自己的現有解決方案相似。 (存在一定的差異,例如捕獲的變量最終會作爲某個其他(生成)類的新創建對象的字段。您現有的解決方案不會這樣做:您有一個每個「臨時」存儲位置你的類的實例而不是每個通話PrintIt,這是不好的 - 它不是線程安全的,例如)

+0

在打印方法,就是它不如送的說法e.Graphics而不僅僅是電子商務?或者這不是什麼大不了的事? – sooprise 2011-02-11 17:06:48

+0

@sooprise:這取決於你 - 我認爲它不需要整個`PrintPageEventArgs`,所以讓我們給它它需要的。對不起,也許我不應該這樣做'重構';它減損了實際問題。 – Ani 2011-02-11 17:08:38

1

不正常,但對於這個API(的WinForms印刷)這是通常的做法。

請考慮PrintThis不僅僅是一個變量,而是您的「模型」或「文檔」。

0

或者,你可以使用繼承:

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); 
} 
相關問題