none
Как записать одну строку в два метода одним разом? RRS feed

  • Вопрос

  • Как записать одну строку в два метода одним разом?

            Graphics G;
            Pen P;
    
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                G = e.Graphics;
                P = new Pen(Color.FromArgb(0, 192, 0), 10);
                G.DrawLine(P, 0, 0, 10, 10);
    
                Method_Dispose();
            }
            private void Drawing(object sender, EventArgs e)
            {
                G = panel1.CreateGraphics();
                P = new Pen(Color.FromArgb(0, 192, 0), 10);
                G.DrawLine(P, 0, 0, 10, 10);
    
                Method_Dispose();
            }
    
            private void Method_Dispose()
            {
                G.Dispose();
                P.Dispose();
            }
    В следующем методе я добавил Method_Dispose() каждому в конце, но в реальной программе методом много и каждому отдельно добавлять не легко, как добавить в конец этим методам Method_Dispose() не отдельно, а одним разом?
    • Изменено Ziya Ceferov 4 августа 2012 г. 9:17
    4 августа 2012 г. 9:17

Ответы

  • Так, как показано у Вас лучше не делать, при добавлении/удалении объектов придётся и с методами возиться. Можете использовать инструкцию using

    using(G = e.Graphics;)
    { 
      P = new Pen(Color.FromArgb(0, 192, 0), 10);
      G.DrawLine(P, 0, 0, 10, 10);
    }

    или вызывать Dispose()  в каждом обработчике, так намного лучше будет.

    • Помечено в качестве ответа Ziya Ceferov 4 августа 2012 г. 16:03
    4 августа 2012 г. 9:59
    Модератор

Все ответы

  • Так, как показано у Вас лучше не делать, при добавлении/удалении объектов придётся и с методами возиться. Можете использовать инструкцию using

    using(G = e.Graphics;)
    { 
      P = new Pen(Color.FromArgb(0, 192, 0), 10);
      G.DrawLine(P, 0, 0, 10, 10);
    }

    или вызывать Dispose()  в каждом обработчике, так намного лучше будет.

    • Помечено в качестве ответа Ziya Ceferov 4 августа 2012 г. 16:03
    4 августа 2012 г. 9:59
    Модератор
  • ну в узинге ; убрать только.

    Если надо P диспозить, то

    using(P = new Pen(Color.FromArgb(0, 192, 0), 10))
    using(G = e.Graphics)
    {
    ....
    }

    а надо?

    4 августа 2012 г. 11:47
  • Я так понял using нужно применять в каждом методе и в каждом это писать?

    Но если это не так то я написал следующий код, который не работает:

            Graphics G;
            Pen P;
    
            private void button1_Click(object sender, EventArgs e)
            {
                Method_Using();
                G.DrawLine(P, 0, 0, 50, 50);
            }
    
            private void Method_Using()
            {
                using (G = this.CreateGraphics()) ;
                using (P = new Pen(Color.Black, 1)) ;
            }
    Дело в том что у меня уже во всех методах действует один метод в начале, просто Dispose применяют в конце и поэтому это не помогло, но если это можно делать объявляя к примеру с помощью using в начале то это возможно поможет.

    • Изменено Ziya Ceferov 4 августа 2012 г. 14:04
    4 августа 2012 г. 14:00
  • "Я так понял using нужно применять в каждом методе и в каждом это писать?" - да, имено так. На самом деле using - "синтаксический сахар", который оборачивается в выражение подобное (привожу пример из спецификации) следующему:

    //Это, превращается в
    using (ResourceType resource = expression) statement
    
    /*это, на самом деле тут несколько вариантов, привожу для краткости только один*/
    {
    	ResourceType resource = expression;
    	try {
    		statement;
    	}
    	finally {
    		if (resource != null) ((IDisposable)resource).Dispose();
    	}
    }
    
    

    который гарантированно вызывает метод Dipose. У Вас это будет примерно так:

    private void panel1_Paint(object sender, PaintEventArgs e)
            {
                using(G = e.Graphics,P = new Pen(Color.FromArgb(0, 192, 0), 10))
                {
                  G.DrawLine(P, 0, 0, 10, 10);
                }
            }

    В конечном случае получается использовать либо так, или вызывать метод(ы) Dispose в каждом методе отдельно. Выносить их в отдельный метод, как Вы реализовали - не вариант.

    4 августа 2012 г. 15:43
    Модератор
  • Отмечу, что не нужно вызывать Dispose у графикса, который создаётся в обработчике события Paint в PaintEventArgs. Его создала система, она его и удалит.
    16 августа 2012 г. 19:36