当前位置:  开发笔记 > 编程语言 > 正文

什么是 - 单个和多个调度(与.NET相关)?

如何解决《什么是-单个和多个调度(与.NET相关)?》经验,为你挑选了2个好方法。

它是否与重载相同,如果没有,你可以在C#中提供每个例子吗?

我已经阅读了对SO中提出的类似问题的回复......我不理解发布给它的回复.

类似的问题在这里问

编辑:使用C#4.0中新的"动态"关键字...这会使语言"多调度"启用吗?



1> configurator..:

C#使用单个调度,其中包括重载方法.当你有代码

stringBuilder.Append(parameter);

调度程序查看stringBuilder类中定义的所有方法,并找到正确的方法.

对于多个调度示例,让我们看一下Prolog(这是我能想到的第一个).你可以在prolog中定义一个函数:

func(Arg1, Arg2) :- ....body....

这不是在任何类中定义,而是在全局范围内定义.然后,您可以调用func(Arg1, Arg2)任何两个参数,并将调用此函数.如果你想要重载之类的东西,你必须验证函数内部的参数类型,并多次定义它:

func(Arg1, Arg2) :- is_number(Arg1), is_string(Arg2), ....body....
func(Arg1, Arg2) :- is_string(Arg1), is_list(Arg2), ....body....
func(Arg1, Arg2) :- is_number(Arg1), is_list(Arg2), ....body....

然后,您将发送的任何两个参数类型都将被检查 - 这是多个调度部分.

简而言之,单个调度只查看第一个参数(在我们的第一个示例中为stringBuilder)定义的方法,然后解析使用其他参数调用的正确重载.多个调度具有在全局范围中定义的方法/函数,并在重载解析期间将所有参数视为相同.

我希望自己明确表示,这是一个非常艰难的主题.


更新:我忘了提到,多个调度在运行时发生,而单个调度在编译时发生.
更新#2:显然,事实并非如此.



2> Sean..:

多次发送是超载的"形式"......

例如,C#是单一调度,因为如果根据一个参数计算出要调用的方法,则使用"this"指针.当你有这样的事情:

Base base= new Derived();
base.DoSomething();

方法Derived.DoSomething即使通过基指针调用它也会被调用.现在,如果我们有以下内容:

class Derived : Base
{
  public override void Process(Stream stream);
  public override void Process(FileStream stream);
  public override void Process(MemoryStream stream);
}

我们这样做:

Stream stream= new MemoryStream(...);
Base b= new Derived();
b.Process(stream);

然后我们将调用Process(Stream)方法,Derived因为C#对对象指针(b)执行单个调度,然后使用编译时信息来决定调用哪个方法.即使stream是MemoryStream,单个调度系统也会忽略它.

在多调度系统中,将查看对象指针(如在C#中)并且将检查参数的运行时类型.在上面的示例中,因为stream实际上是一个MemoryStream,所以系统会调用Process(MemoryStream)方法.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有