2011-02-11 33 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); 
} 
相关问题