我的教授问了我们这个问题:C#(.Net)编译器和Java编译器技术有什么区别?
就编译器而言,除了显而易见的“输入”和“输出”之外,我能想到的最大区别是泛型实现方式,因为两者都有泛型,但非常不同(类型擦除 vs 运行时辅助)。装箱模型显然是不同的,但我不确定对于编译器来说是否很重要。
在匿名方法、匿名内部类、lambda 表达式、委托等方面,明显存在特性差异,但很难进行1:1比较。尽管如此,最终只有您的教授知道他寻求的答案(对教授表示敬意,但不一定会惊讶他的答案已经过时了一年或更久)。
一个区别是C#编译器具有一些类型推断的能力,而Java编译器没有(尽管Java 7可能会改变这一点)。举个简单的例子,在Java中,你必须输入Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
,而在C#中,你可以使用var anagrams = new HashMap<String, List<String>>();
(尽管你可以在C#中创建非常大、复杂的表达式,而不必命名类型)。
另一个区别是C#编译器可以创建表达式树,使您能够将一个函数的描述传递给另一个函数。例如,(Func<int,int>) x => x * 2
是一个函数,它接受一个整数并将其加倍,而(Expression<Func<int,int>>) x => x * 2
是一个数据结构,描述了一个接受一个整数并将其加倍的函数。您可以将此描述编译成一个函数(在本地运行)或将其翻译成SQL(作为数据库查询的一部分运行)。