对于下列委托的定义和调用有几个疑问,疑问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 }
myDelegate(i.ToString)而不是myDelegate(i.ToString()).
这是个委托初始化.参数是传给委托构造函数的
md是一个方法引用,就是委托引用,指向一个委托对象.md()调用的是方法.
是要 传递一个方法; 不是要执行一个方法,执行方法加括号。
// 摘要:
// 将此实例的数值转换为其等效的字符串表示形式。
//
// 返回结果:
// 此实例的值的字符串表示形式,由减号(如果值为负)和没有前导零的从 0 到 9 的数字序列组成。
[SecuritySafeCritical]
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public override string ToString();
ToString()和你定义的委托有相同的签名(返回值和参数),在使用的时候 只需要传方法名就可以了不需要加括号
你把int当作一个类 而i为该类的一个实例对象 你得到这个方法就是i.ToString(); 将方法作为参数 只需要传方法名即可
myDelegate md = new myDelegate(i.ToString);只是声明了一个myDelegate类型的委托,所以i.ToString传递的是函数引用,i.ToString()定义与myDelegate委托符合。真正的函数调用在Console.WriteLine(md());中的md()。楼主关于委托的基本概念还是比较混乱
翻译成表达式是这样子的
myDelegate md = ()=>return i.ToString();
Console.WriteLine(md());
挺迷惑人的。。。