C#中的委托如何比C/C++中的函数指针更好?

pec*_*ker 14 .net c c#

C#中的委托提供与C中的函数指针类似的功能.我听到有人说"C#委托实际上比C中的函数指针更好".怎么会?请举例说明.

ito*_*son 15

"更好"是主观的 - 但主要的区别是:

  • 类型安全.委托不仅保证引用有效方法,而且保证引用具有正确签名的方法.
  • 它是一个绑定方法指针 - 也就是说,委托可以指向要调用委托的特定对象.因此,Action<string>代表可以参考alice.GetNamebob.GetName不仅仅是Person.GetName.这可能类似于C++"指向成员的指针" - 我不确定.

此外,C#语言通过委托支持对匿名方法和lambda表达式的闭包 - 即捕获声明过程的局部变量,委托可以在以后执行时引用该变量.这并不是严格来说代表的一个特性 - 它由C#编译器在匿名方法和lambda表达式上做了一些魔术 - 但它仍然值得一提,因为它在C#中实现了很多功能习惯用法.

编辑:正如CWF在评论中指出的那样,C#委托的另一个可能的优点是委托类型声明对于许多人来说更容易阅读.当然,这可能是熟悉和经验的问题.

  • 哇,不要把它作为"除了"之外的东西.闭包是一项巨大的交易,可以实现全新的编程风格(功能). (3认同)
  • 与特定语言功能相比,类型安全更像是语言问题.也就是说,你唯一想到的就是语法.C语言中的函数指针声明(可能在不使用Boost时可能是C++)很难解开.但委托声明很容易.另外,lambdas是代表的一个特例(我认为),它们有时非常有用. (2认同)