C#语言不需要委托的概念吗?

时间:2015-06-03 08:48:09

标签: java c# c++ callback delegates

感谢 s的客观性,特别是在C#是您选择的语言的情况下。愤怒的downvoters,我想我在这里问了一个合理的问题?否则请留下建设性意见。

问题......

但是,我从来没有看到使delegate成为显式概念/关键字的任何真正优势,而不是像C ++或Java那样只管理回调的概念 - 将函数指针视为只是现有类型系统下的另一种情况。 (P.S.是的,C#泛型与C ++泛型不同,而Java有运行时而不是编译时泛型,但你得到了我的漂移)。

(所有傲慢和教条除外)为什么C#的设计者认为适合为一个常见的现有编程概念赋予一个新名称,这个概念可以被称为泛型函数指针/回调?如果没有这样的概念,代表们是否可以更简单地用C#代表呢?

免责声明我已经在stackoverflow上查看了很多答案,但其中没有一个能够令人满意地回答为什么设计师认为适合包含另一个关键字来解决回调处理这样的问题。

2 个答案:

答案 0 :(得分:4)

C ++有#34;官方" (非促销)"完整"来自C ++ 11(std::function)的代表......在此之前,获取指向成员函数的指针总是有点hackish ...所以我不会认为C ++是一个很好的比较: - 并且C ++可以使圆括号重载,因此更容易隐藏"需要做的黑客攻击并给程序员一个简单的"使用std::function

的方式

现在...... Java ... To"更正" (但是,让我们说它不是一个遗漏,而是一个计算出来的决定,所以他们没有任何东西可以纠正)他们首先必须在Java 1.1中引入匿名类,然后再引入缺少的委托概念在Java 8中他们引入了功能接口(作为一个非Java程序员,我认为最后一件事是有点hackish ...元描述接口有一个单一的方法,然后在编译时强制执行它...我不知道#39;非常喜欢...)。这是因为否则所需的样板代码非常多......

让我们开始简单...... IComparer<>界面......这是一个具有单一方法的界面,因此它与委托非常相似...

一个简单的实现:

public class MyComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        return x.CompareTo(y);
    }
}

这里有一个样板行,第一行(public class MyComparer : IComparer<int>)。通过引入C#delegate,您已经为代表的每次使用获得了一行......但是等等!让我们说你的代表&#34;需要参考&#34;包含&#34;它...

public class MyComparer : IComparer<int>
{
    public MyClass Target;

    public int Compare(int x, int y)
    {
        return Target.Ascending ? x.CompareTo(y) : y.CompareTo(x);
    }
}

现在这个类需要是MyClass的嵌套类。请注意,我没有任何针对嵌套类的内容......

我们添加了一个新行(public MyClass Target)...但是这段代码通常写错了...你不应该有公共的非只读字段。您可以使用自动属性public MyClass Target { get; set; },但这也是C#3.0中引入的synctactic sugar ...如果没有它们,样板代码会增长......我宁愿拥有private readonly MyClass Target ..但是那么我必须为构造函数添加四行...你想让我为代表写多少行? : - )

C#/ .NET代理仍然提供了更大的灵活性:您使用的函数可以有任何名称,因此您可以在同一个类中拥有多个... MyComparer可以作为两个方法实现:

public int CompareAscending(int x, int y) {}

public int CompareDescending(int x, int y) {}

不添加太多代码,或将所有内容拆分为多个(嵌套)类。

答案 1 :(得分:3)

代表不仅仅是一个简单的回调。首先,它适用于静态方法和实例方法,并且调用者不必处理差异。其次,委托不是单个方法指针。它可以是一个&#34;指针链&#34;,因此呼叫者可以通过一次呼叫呼叫多个回叫 - 再次,呼叫者不必担心它是单个或多个呼叫。 是的,可以从头开始实现相同的机制 - 但是可以使用机器代码构建所有内容 - 需要高级语言。