Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';Java有方法委托吗?_C#_Java_Delegates - Fatal编程技术网

C# 为什么';Java有方法委托吗?

C# 为什么';Java有方法委托吗?,c#,java,delegates,C#,Java,Delegates,爪哇古鲁纳人(内塔)नाथ = 梵语(代表神的守护者)应该屈尊接受委托的必要性,并将其起草到Java规范中 在C#中,我可以将方法作为一个被引用为委托的处理程序来传递,而不需要仅仅因为我需要在Java中传递一个方法而费力地创建一个类 Sun决定不在Java中使用它的原因是什么(除了引用一个全新类的笨拙用法之外)或者是什么?与委托相比,创建类或匿名实现接口有哪些优势?我想不出有什么,可以吗?简单。 通过不在Java中引入委托的概念,他们使语言更简单。就像没有属性、索引器 (顺便说一句,使用更简单的

爪哇古鲁纳人(内塔)नाथ = 梵语(代表神的守护者)应该屈尊接受委托的必要性,并将其起草到Java规范中

在C#中,我可以将方法作为一个被引用为委托的处理程序来传递,而不需要仅仅因为我需要在Java中传递一个方法而费力地创建一个类

Sun决定不在Java中使用它的原因是什么(除了引用一个全新类的笨拙用法之外)或者是什么?与委托相比,创建类或匿名实现接口有哪些优势?我想不出有什么,可以吗?

简单。 通过不在Java中引入委托的概念,他们使语言更简单。就像没有属性、索引器

(顺便说一句,使用更简单的语言并不一定更简单;也许他们应该添加代理,但这不是他们做出设计决策的方式)

在我看来,C#中的代理很难看。(将某物声明为变量,然后在OOP中感觉不好之后添加
()

此外,如果需要,可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法

您只需使用
java.lang.reflect.Method

编辑:正如您所说,使用反射不是一个好方法。这是事实,但在我看来,从面向对象的角度来看,使用委托并不是一个更好的方法。它是一个函数式语言构造。

在Java中,您有,它绑定到父类的一个特定实例,并且可以直接访问其成员。因此,实现内部类不需要比编写方法更多的代码


C#没有内部类。内部类(如Java)和委托(如C#)都有各自的优点(有时我会怀念C#中的内部类),但从语言设计者的角度来看,坚持其中任何一个(而不是同时支持两者)都是有意义的,因为这使类库设计更加一致。

java没有闭包,因为它不是一种函数式语言,而是一种面向对象的语言。
在许多情况下,您可以伪造另一种语言范例,在这种情况下,使用匿名接口而不是闭包。
但现在情况正在发生变化,在scala、groovy、jruby等结合了oo和函数范式的新jvm语言的压力下,java委员会正试图将闭包放入java 7中。

[小编辑]

首先我要说的是,我并不反对或赞成向Java添加委托,我只是解释一下背景

首先,Sun的Java团队传统上对语言的发展更为保守(与C#团队相比)

其次,将委托构造添加到Java中可能需要引入一个新的关键字,例如:“delegate”。这将打破现有的代码,其中包含名为“delegate”的变量

第三,这种设计原则被称为“单一选择原则”" . 当应用于语言设计时,这意味着程序员应该只有一种明显的方法来实现某些东西。或者,换句话说,多项选择是有风险的。将委托引入Java将违背这一原则,因为它们的行为可以通过匿名类实现


[当然,这一原则不应该从字面上理解。如果是这样的话,我们将使用一台很好的老图灵机器编程。我想Sun公司的人认为代理的好处不会超过单选违规]

以下是Microsoft将其添加到Java中的建议,以及Sun拒绝代理的原因

依我看,爪哇应该在12年前关闭。为了关闭,没有人听。用他自己的话来说:

我个人主张自1997/98年以来增加关闭。我的血 当我回忆起我得到的反应时,压力仍在显著上升 当时:“我们的客户没有要求,为什么要添加它?”


悲哀,但确实如此。

可能是因为如果一个方法要在对象之间传递和共享,它不应该由一个类拥有。它可能应该通过自己的类共享。我的意思是,如果你想到一个瞬态函数,你会觉得有点奇怪。我想是坏消息吧

我非常喜欢UI工作的代理。它使窗口操作更容易编程

这可能归结为您认为更负面的内容,一个拥有错误所有者的函数,或者(在我的例子中)您的代码中的方法属于一个类(按钮单击、窗口大小调整事件),而不是该类的一部分


不确定我更喜欢哪个。

不管它值多少钱,我已经使用反射在Java中实现了回调/委托支持。细节和工作来源是。

因为,他们认为:

绑定方法引用[委托]完全是不必要的。[…]此外,它们有损于Java语言的简单性和统一性。绑定方法引用不是未来语言发展的正确路径

摘自本(旧)白皮书:

现在Java正在考虑在语言发展到一定程度后添加它们。我很确定它们很快就会出现在该语言中(至少比Perl6:P早)


您还可以使用:

我更新了问题的标题,因为“Java应该有方法委托”听起来很糟糕。越来越多的人认为,他们都犯了一个很大的错误,一开始就没有委托。有人说,即使是代表们也会是一个不好的举动,也没有人会认为功能是第二类的对象。我不想成为语法纳粹,但是你让他看起来很糟糕(尽管你编辑的意图是好的)谢谢。什么时候