关于C#委托的问题

JACKCHI1234 2011-10-24 06:34:50
先看一段代码:
class Program
{
delegate void RunOnce();
private static void MultipleRun(RunOnce method, int count)
{
for (int i = 0; i < count; i++)
{
method();
}
}

static void Main(string[] args)
{
TestClass tc = new TestClass();
MultipleRun(tc.PrintDate, 100);
MultipleRun(tc.PrintTime, 100);
}
}

class TestClass
{
public void PrintTime()
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
}

public void PrintDate()
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
}
}请注意红颜色的代码,我想问的是MultipleRun()的参数和Main方法中传入的参数是同一个类型吗?如果不是,那为什么可以顺利执行?在这段代码中,没有看到有委托实例化的对象,怎么MultipleRun()中的method()就调用到了PrintTime()和PrintDate()了呢?
...全文
40 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JACKCHI1234 2011-10-24
  • 打赏
  • 举报
回复
明白了,谢谢!
宝_爸 2011-10-24
  • 打赏
  • 举报
回复
委托并不需要实例化吧。

例如

// Declare a delegate:
delegate void Del(int x);

// Define a named method:
void DoWork(int k) { /* ... */ }

// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;

也只是赋值,跟传参数是一样的。

代码来自msdn.
http://msdn.microsoft.com/en-us/library/98dc08ac(v=vs.80).aspx

gxmark 2011-10-24
  • 打赏
  • 举报
回复
其实是利用了编译器的委托推断功能,这样可以简化代码的编写。
MultipleRun(tc.PrintDate, 100);
MultipleRun(tc.PrintTime, 100);
可以理解为下面代码的简写:
MultipleRun(new RunOnce(tc.PrintDate), 100);
MultipleRun(new RunOnce(tc.PrintTime), 100);
小赖赖 2011-10-24
  • 打赏
  • 举报
回复
Main方法的参数是命令行参数,是字符串
MultipleRun的参数是委托RunOnce,毫无关系
delegate void RunOnce();在这里声明的
编译器自动把PrintTime()转成委托RunOnce,赋值给method了
所以能执行

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧