none
帮忙看看///后面的问题,谢谢。 RRS feed

  • 问题

  •  

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleEvents2
    {
        class Class1
        {
            //声明一个委托 delegate FireEventHandler,delegate 没有 静态或实例 成员的说法
            public delegate void FireEventHandler(string s);

            //声明 FireEventHandler 委托类型的事件
            //亦即将 FireEventHandler 理解为数据类型,易理解
            public event FireEventHandler FireInstance;
            public static event FireEventHandler FireStatic;

            static void Main(string[] args)
            {
                System.Console.WriteLine("Hello World");

                //用 delegate: FireEventHandler() 委托,建立委托关系
                //Static 方法 FireStatic() 代理(被委托)了 Static 方法 Fire1()
                FireStatic += new FireEventHandler(Fire1);
                //Static 方法 FireStatic() 代理(被委托)了 Instance 方法 .Fire2()
                FireStatic = FireStatic + new FireEventHandler(new Class1().Fire2);///这种用a=a+new(b)的写法与上面a+=new b的写法可以互换么?全都一样么?

                Class1 c = new Class1();

                //Instance 方法 .FireInstance() 代理(被委托)了 Instance 方法 .Fire2()
                c.FireInstance += new FireEventHandler(c.Fire2);

                //Instance 方法 .FireInstance() 代理(被委托)了 Static 方法 Fire1()
                c.FireInstance = new FireEventHandler(Fire1) + c.FireInstance;
                //以上仅是声明了委托关系,尚未执行 委托代理方法 !

                System.Console.WriteLine("下面列印委托关系:");
                System.Console.WriteLine("Static 方法 FireStatic() 作为代理接受以下委托:");

                ListDelegateRelation(FireStatic);

                System.Console.WriteLine();

                System.Console.WriteLine("Instance 方法 .FireInstance() 作为代理接受以下委托:");
                ListDelegateRelation(c.FireInstance);

                System.Console.WriteLine("请键入任意字符(串),\"q\" 退出!");
                string s;
                while (true)
                {
                    s = System.Console.ReadLine();
                    System.Console.WriteLine("--------------------------");
                    System.Console.WriteLine("以下是键入 \"{0}\" 后,触发事件的响应:");
                    //我们在此编程,即:在接受屏幕行录入后,令程序执行委托代理方法!
                    //从而触发了事件!
                    // FireStatic 静态事件被触发了
                    FireStatic("FireStatic 静态事件被触发了:\nStatic 方法 FireStatic() 受委托代理执行了 {0}\n你键入了: [" + s + "]\n");

                    // .FireInstance 实例事件被触发了
                    c.FireInstance(".FireInstance 实例事件被触发了: \nInstance 方法 .FireInstance() 受委托代理执行了 {0}\n你键入了: [" + s + "]\n");
                    System.Console.WriteLine("=======================================");
                    System.Console.WriteLine("请键入任意字符(串),\"q\" 退出!");
                    if (s == "q")
                        break;
                }
                ///*
                //解除委托关系可用 "-="
                //下面解除委托,列印剩余委托关系
                ListDelegateRelation(FireStatic);  ///为什么运行到这一句,FireStatic.ToString()的值是 ConsoleEvents2.Class1+FireEventHandler?

                FireStatic -= new FireEventHandler(Fire1);
                ListDelegateRelation(FireStatic);

                FireStatic = FireStatic - new FireEventHandler(new Class1().Fire2);///这一句可以写成FireStatic -=new FireEventHandler(new Class().Fire2)么?为什么?
                ListDelegateRelation(FireStatic);

                c.FireInstance = new FireEventHandler(Fire1) - c.FireInstance;///这一句是不是在“-”的左右写反了?应该是 c.FireInstance-new FireEventHandler(Fire1)呢?
                ListDelegateRelation(c.FireInstance);

                c.FireInstance = c.FireInstance - new FireEventHandler(Fire1);
                ListDelegateRelation(c.FireInstance);

                //*/
                Console.Read();
            }

            //静态方法
            static void Fire1(string s)
            {
                //响应事件的程序
                System.Console.WriteLine(s.Replace("{0}", "static 方法 Fire1()"));
            }

            //实例方法
            void Fire2(string s)
            {
                //响应事件的程序
                System.Console.WriteLine(s.Replace("{0}", "Instance 方法 .Fire2()"));
            }

            static void ListDelegateRelation(FireEventHandler x)
            {
                if (x != null)
                {
                    //   foreach (System.Delegate d in x.GetInvocationList())
                    foreach (FireEventHandler d in x.GetInvocationList())
                    {
                        System.Console.WriteLine(x.ToString() + " 类型的事件代理了 " + (d.Method.IsStatic ? x.Target + " 类的 Static 方法 " : d.Target + " 的 Instance 方法 .") + d.Method.Name);
                    }
                }
                else
                {
                    System.Console.WriteLine("没有任何委托关系");
                }
            }
        }
    }


    maiyude
    2009年1月29日 12:15

答案

  • 你好!

       显示+号很正常啊!因为你的委托类型是嵌套在类型Class1中的,而ToString函数默认是显示类型的全名的(包括命名空间还有你的类型嵌套在其中的那个类型,然后是+号,然后是你的委托类型)

       希望这个解释对你有帮助!

     

    周雪峰
    • 已标记为答案 maiyude 2009年1月30日 5:10
    2009年1月30日 4:20
    版主

全部回复

  •  我又找一个问题了。

    执行后,屏幕上是

    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 类
    的 Static 方法 Fire1
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
    Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
    Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 ConsoleEvents2.Class1 的
    Instance 方法 .Fire2
    ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 类的 Static 方法 Fire1
    没有任何委托关系


    为什么最后在,"没有任何委托关系"的前面是 “ConsoleEvents2.Class1+FireEventHandler 类型的事件代理了 类的 Static 方法 Fire1”,这里面的“ 类的Static 方法 Fire1”的名字怎么没像上面那样打印出来呢?
    maiyude
    2009年1月29日 12:32
  • 可不可以 你试一下就知道

    第二个问题 你应该调试下 看是不是为空

    然后看为什么为空

    你好象还有个class1类

    代码不全别人无法帮你调试

    2009年1月29日 12:46
  •  你好!

       你打个在foreach循环内打个断点,然后看看最后一次循环的x.Target是否为null!


    周雪峰
    2009年1月30日 2:59
    版主
  • 1。上面的大大,偶的代码是全的,可以运行的。

    2.谢谢楼上的大大,的确管用。。

    但是不知道为什么?

    3.还有就是

    屏幕输出有

    ConsoleEvents2.Class1+FireEventHandler

    但是不知道为什么,  FireStatic.ToString()的值是 "ConsoleEvents2.Class1+FireEventHandler" ?

    偶知道,根据程序中的描述,FireStatic是一个静态事件,那么值里面怎么会出现 + 号呢?迷惑。

     


    maiyude
    2009年1月30日 3:13
  • 你好!

       显示+号很正常啊!因为你的委托类型是嵌套在类型Class1中的,而ToString函数默认是显示类型的全名的(包括命名空间还有你的类型嵌套在其中的那个类型,然后是+号,然后是你的委托类型)

       希望这个解释对你有帮助!

     

    周雪峰
    • 已标记为答案 maiyude 2009年1月30日 5:10
    2009年1月30日 4:20
    版主
  • 太有帮助了,强人个...谢谢.
    maiyude
    2009年1月30日 5:04
  • 。。。。。。。。。。。。。。。。。。。

    嫉妒~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    2009年1月30日 5:55
  • singledark 说:

    。。。。。。。。。。。。。。。。。。。

    嫉妒~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



    ....嫉妒什么啊。。是你的问题太让人无语了吧。。我觉得我们都已经解释的很详细了。。还被说解释的不对。。

    我也嫉妒,嫉妒这个问问题的人。。


    如果问题解答了请标记为【已解决】,欢迎到我的博客去访问http://www.shangducms.com/blog/uid115.html
    2009年1月30日 6:08
    版主
  • 我说让你描述一下狗长什么样 你给我描述的却是猫长什么样

    你描述的再详细 咱也不说对

    你BLOG哪个笔记本是什么牌子的?

    2009年1月30日 6:46
  • maiyude 说:

    太有帮助了,强人个...谢谢.


    maiyude
    你好!

         不必客气啊!

         祝愿你和你的家人新年快乐,身体健康!




    周雪峰
    2009年1月30日 8:55
    版主