none
为什么一个方法里面有个子方法可以循环的调用传进方法的参数呢 RRS feed

  • 问题

  •     #region
            long GetTestTime(TestMethod testMethod)
            {
                Stopwatch stopper = new Stopwatch();

                stopper.Start();
                testMethod();
                stopper.Stop();

                return stopper.ElapsedMilliseconds;
            }
            void OnValueTest(object sender, EventArgs e)
            {
                float boxedTime = GetTestTime(TestValueBoxed);
                float genericTime = GetTestTime(TestValueGeneric);

                float perf = 100 * 1 / ((genericTime / boxedTime));

                m_TextResultBox.Text = Math.Round(perf).ToString() + "%";
            }
            void OnReferenceTest(object sender, EventArgs e)
            {
                float boxedTime = GetTestTime(TestReferenceBoxed);
                float genericTime = GetTestTime(TestReferenceGeneric);

                float perf = 100 * 1 / ((genericTime / boxedTime));

                m_TextResultBox.Text = Math.Round(perf).ToString() + "%";
            }
            void TestValueBoxed()
            {
                Stack stack = new Stack();

                stack.Push(1);
                stack.Push(2);
                stack.Push(3);
                stack.Push(4);

                long temp = 0;
                long iteration = COUNT * m_IterationBar.Value;
                for (long i = 0; i < iteration; i++)
                {
                    stack.Push(i);
                    temp = (long)stack.Pop();
                }
            }

            void TestValueGeneric()
            {
                Stack<long> stack = new Stack<long>();

                stack.Push(1);
                stack.Push(2);
                stack.Push(3);
                stack.Push(4);

                long temp = 0;
                DateTime start = DateTime.Now;

                long iteration = COUNT * m_IterationBar.Value;

                for (long i = 0; i < iteration; i++)
                {
                    stack.Push(i);
                    temp = stack.Pop();
                }
            }
            void TestReferenceBoxed()
            {
                Stack stack = new Stack();

                stack.Push("1");
                stack.Push("2");
                stack.Push("3");
                stack.Push("4");

                string temp = String.Empty;

                long iteration = COUNT * m_IterationBar.Value;

                for (long i = 0; i < iteration; i++)
                {
                    stack.Push("AAAAA");
                    temp = (string)stack.Pop();
                }
            }
            void TestReferenceGeneric()
            {
                Stack<string> stack = new Stack<string>();

                stack.Push("1");
                stack.Push("2");
                stack.Push("3");
                stack.Push("4");

                string temp = String.Empty;

                long iteration = COUNT * m_IterationBar.Value;

                for (long i = 0; i < iteration; i++)
                {
                    stack.Push("AAAAA");
                    temp = stack.Pop();
                }
            }
        }

    这段代码里的testMethod();方法为什么一往里面跟进去就是到这一步long GetTestTime(TestMethod testMethod)了呢,难道有这种用法吗,是要循环吗,不明白,请高人指点下,谢谢。

    2010年4月7日 17:10

答案

  • 你好!

    你可以把它理解为你没有写任何代码的方法嘛。

    比如下面的代码都是可以执行的。

    public delegate void ClientDelegate();
    
    static void Main(string[] args)
    {
        ClientDelegate d = delegate
        {
            // 没有执行代码
        };
        d();
        ClientDelegate d1 = delegate
        {
            Console.Write("Hello");
        };
        d1();
        Console.ReadKey();
    }


    知识改变命运,奋斗成就人生!
    2010年4月8日 1:36
    版主

全部回复

  • public class Perf : Form
        {
            delegate void TestMethod();

            Button m_ValueTypesTest;
            Button m_ReferenceTypesTest;
            TextBox m_TextResultBox;
            Label m_TestResultLabel;
            TrackBar m_IterationBar;
            Label m_DurationLabel;
            const long COUNT = 100000;

    对了TestMethod是个委托,在我看来就算是委托,它调用的方法testMethod()也应该有方法体吧,为什么没有也行呢

    2010年4月7日 17:28
  • 你好!

    你可以把它理解为你没有写任何代码的方法嘛。

    比如下面的代码都是可以执行的。

    public delegate void ClientDelegate();
    
    static void Main(string[] args)
    {
        ClientDelegate d = delegate
        {
            // 没有执行代码
        };
        d();
        ClientDelegate d1 = delegate
        {
            Console.Write("Hello");
        };
        d1();
        Console.ReadKey();
    }


    知识改变命运,奋斗成就人生!
    2010年4月8日 1:36
    版主