首页 新闻 搜索 专区 学院

一个委托在第一次使用的时候为何可以使用+=号

0
悬赏园豆:10 [已解决问题] 解决于 2014-07-04 07:56
 1 public delegate void NumberChangedEventHandler(Int16 count);
 2     public class Publisher
 3     {
 4         Int16 count = 0;
 5         public NumberChangedEventHandler numberChanged;
 6        // public event NumberChangedEventHandler numberChanged;
 7 
 8         public void DoSomething()
 9         {
10             if (numberChanged != null)
11                 numberChanged(++count);
12         }
13     }
14 
15     public class Subscribler
16     {
17         public void NumberChanged(Int16 count)
18         {
19             Console.WriteLine("Subscriber notified: count = {0}", count);
20         }
21     }

再向下面那样使用:

Publisher pub = new Publisher();
            Subscribler sub = new Subscribler();

            //第一次居然可以使用+=,而不是=
            pub.numberChanged += new NumberChangedEventHandler(sub.NumberChanged);
            pub.DoSomething();


这是为何,在教材上明明说的是委托类型的对象在没有初始化前是不能直接使用+=绑定操作的。而直接实例化一个委托再进行+=确定不可以:

NumberChangedEventHandler newDele;
            newDele += new NumberChangedEventHandler(sub.NumberChanged);

这样子就会报错。

请大神解释这是为哈?

shux的主页 shux | 初学一级 | 园豆:193
提问于:2014-07-03 21:15
< >
分享
最佳答案
0

只是因为你第一个+=之前给引用赋值了而已·你基础太差了··

Publisher pub = new Publisher();这边已经赋值了。也就是PUB不等于null,你把这个去掉就会异常了

收获园豆:9
吴瑞祥 | 高人七级 |园豆:29364 | 2014-07-04 07:30

汗,pub只是一个对象啊,numberChanged是pub的一个成员,pub实例化就代表pub的成员都实例化了?

shux | 园豆:193 (初学一级) | 2014-07-04 07:42

懂你意思了,new一下的时候已经对成员初始化过了。多谢点拨!

shux | 园豆:193 (初学一级) | 2014-07-04 07:54
其他回答(1)
0

你的教材有问题吧,  委托是可以接受+=、+运算符的对象,它的相加语法和其它支持加运算的对象(例如string)是一样的。

你认为如下代码合法不?

    string s = null;
    s += "hello world";

 

收获园豆:1
天方 | 园豆:5375 (大侠五级) | 2014-07-04 01:01

请看第个段代码。

支持(0) 反对(0) shux | 园豆:193 (初学一级) | 2014-07-04 07:17
string str;
str += "";

或者这么使用,你就懂我说的什么了。上面这段显然是错误的使用方式,但是一个委托如果在类Publisher中声明但不实例化也不赋值null,在实例化一个Publisher的对象时,居然没有实例化就或赋值null可以直接使用+=。

支持(0) 反对(0) shux | 园豆:193 (初学一级) | 2014-07-04 07:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册