首页 新闻 会员 周边

委托的参数,请大侠指教

0
悬赏园豆:10 [已解决问题] 解决于 2014-10-16 19:57

对于下列委托的定义和调用有几个疑问,疑问1:在第5行声明委托的时候没有参数为什么第10行实例化的时候可以传参数?

疑问2:第10行代码传参的时候是调用了ToString方法,但是为什么不用加与对小括号()呢?

疑问3:对于有些书中的解释“程序中对象md定义为整数i的ToString方法,输出时则调用方法md()”这样的解释表示不解,对象怎么定义为方法?md()是方法还是委托?

 1 namespace ConsoleApplication1
 2 {
 3     class Program
 4     {
 5         delegate string myDelegate(); 
 6         static void Main(string[] args)
 7         {
 8            
 9             int i = 6;
10             myDelegate md = new myDelegate(i.ToString);
11             Console.WriteLine(md());
12             Console.ReadKey();
13         }
14     }
15 }
寒江蓑立的主页 寒江蓑立 | 初学一级 | 园豆:155
提问于:2014-01-25 16:51
< >
分享
最佳答案
0

myDelegate(i.ToString)而不是myDelegate(i.ToString()).

这是个委托初始化.参数是传给委托构造函数的

md是一个方法引用,就是委托引用,指向一个委托对象.md()调用的是方法.

收获园豆:7
吴瑞祥 | 高人七级 |园豆:29449 | 2014-01-25 16:57
其他回答(5)
0

是要 传递一个方法;  不是要执行一个方法,执行方法加括号。

收获园豆:1
Qlin | 园豆:2403 (老鸟四级) | 2014-01-26 10:06
0

         // 摘要:
        //     将此实例的数值转换为其等效的字符串表示形式。
        //
        // 返回结果:
        //     此实例的值的字符串表示形式,由减号(如果值为负)和没有前导零的从 0 到 9 的数字序列组成。
        [SecuritySafeCritical]
        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
        public override string ToString();

ToString()和你定义的委托有相同的签名(返回值和参数),在使用的时候 只需要传方法名就可以了不需要加括号

你把int当作一个类 而i为该类的一个实例对象 你得到这个方法就是i.ToString(); 将方法作为参数 只需要传方法名即可

收获园豆:1
wolfy | 园豆:2636 (老鸟四级) | 2014-01-26 14:49
0

myDelegate md = new myDelegate(i.ToString);只是声明了一个myDelegate类型的委托,所以i.ToString传递的是函数引用,i.ToString()定义与myDelegate委托符合。真正的函数调用在Console.WriteLine(md());中的md()。楼主关于委托的基本概念还是比较混乱

收获园豆:1
告诉 | 园豆:285 (菜鸟二级) | 2014-01-27 16:27
0

翻译成表达式是这样子的

myDelegate md = ()=>return i.ToString();

Console.WriteLine(md());

菜鸟老了 | 园豆:145 (初学一级) | 2014-01-28 09:37
0

挺迷惑人的。。。

三胖他爹 | 园豆:116 (初学一级) | 2014-02-08 16:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册