Java与c#的一些细节区别
2018-09-05 10:09
716 查看
实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现。
ps. 我写c#过程中,发觉c#有很多优秀的特性,写起来在方便很多,比如lambda,linkq等
结果是打印出Hello World
我们对class文件进行反编译试一下,javap -c -p JavaVsCSharp.class
内部动态生成了一个私有的静态方法
然后然后。。。。我就不会调试了。。。。。。网上的调试我没看懂,怎么跑来跑去的(菜是一种罪过)
不过最后最后就生成了一个内部类,和一个内部方法
转自:你知道C#中的Lambda表达式的演化过程吗?
说白了,c#就是一个delegate委托,类似于c中的函数指针。每一个Lambda对应着一个函数方法,delegate指向这个函数方法,现在Lambda把它简化了,即不用重新写一遍了。
我们可以看到list得到stream流接口以后,就有很多方法可以调用了
Stream这个接口的实现方法都在 ReferencePipeline 实现完了。(话说不知为何,感觉这个类的实现很乱,代码风格差的特别多)
是不是很像SQL语句,用起来也特别的清晰明了。这点可以说c#甩了Java几条街。
由于很少用Linq,我的VS也过期了,难受,官方教程了解下 => 官方Linq教程
后言:可能c#一些东西没有深入到底层,因为VS过期,并且已经很少用了。所以哪里有不对的地方,老哥们,还希望指出,谢谢
ps. 我写c#过程中,发觉c#有很多优秀的特性,写起来在方便很多,比如lambda,linkq等
1.Lambda VS Delegate
Java底层实现:
/** * @Auther: Chang * @Date: 2018/9/2 */ public class JavaVsCSharp { public static void main(String[] args) { testLambda(() -> System.out.println("Hello World")); } private static void testLambda(Print pt) { pt.print(); } } @FunctionalInterface interface Print { void print(); }
结果是打印出Hello World
我们对class文件进行反编译试一下,javap -c -p JavaVsCSharp.class
内部动态生成了一个私有的静态方法
private static void lambda$main$0() { // 空 }
然后然后。。。。我就不会调试了。。。。。。网上的调试我没看懂,怎么跑来跑去的(菜是一种罪过)
不过最后最后就生成了一个内部类,和一个内部方法
private static void lambda$main$0() { System.out.println("Hello World!!!"); } static final class JavaVsCSharp$$Lambda$1 implements Print { private JavaVsCSharp$$Lambda$1() { } @Override public void print() { lambda$main$0(); } }
c#底层实现:
转自:你知道C#中的Lambda表达式的演化过程吗?
说白了,c#就是一个delegate委托,类似于c中的函数指针。每一个Lambda对应着一个函数方法,delegate指向这个函数方法,现在Lambda把它简化了,即不用重新写一遍了。
2.Linq VS Stream表达式
Java Stream实现:
** * @Auther: Chang * @Date: 2018/9/2 */ public class JavaVsCSharp { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(new Random().nextInt(100)); } print(list, "原数据"); list = list.stream().sorted(Comparator.naturalOrder()).distinct() .filter(x -> x > 50 || x % 5 == 0).collect(Collectors.toList()); print(list, "处理后数据"); } private static void print(List<Integer> list, String s) { System.out.print(s + ": "); list.forEach(x -> System.out.print(x + " ")); System.out.println(); } }
我们可以看到list得到stream流接口以后,就有很多方法可以调用了
Stream这个接口的实现方法都在 ReferencePipeline 实现完了。(话说不知为何,感觉这个类的实现很乱,代码风格差的特别多)
c#linq实现:
class IntroToLINQ { static void Main() { // The Three Parts of a LINQ Query: // 1. Data source. int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Query creation. // numQuery is an IEnumerable<int> var numQuery = from num in numbers where (num % 2) == 0 select num; // 3. Query execution. foreach (int num in numQuery) { Console.Write("{0,1} ", num); } } }
是不是很像SQL语句,用起来也特别的清晰明了。这点可以说c#甩了Java几条街。
由于很少用Linq,我的VS也过期了,难受,官方教程了解下 => 官方Linq教程
后言:可能c#一些东西没有深入到底层,因为VS过期,并且已经很少用了。所以哪里有不对的地方,老哥们,还希望指出,谢谢
相关文章推荐
- Java与c#的一些细节区别
- C#与Java的一些区别
- C#与java的一些小区别!!
- c#和java的一些语法区别
- Code Review:C#与JAVA的哈希表内部机制的一些区别
- Java语言 C#语言 一些区别(1)
- Java和c#语法的一些区别
- C#接口和JAVA的区别?
- C#和Java中二维数组的区别
- java 中一些接口和实现类的区别
- 在Java和C#中,abstract class和interface的区别
- java和C#的一些不同之处
- Java与C#的区别(语言级别)[转]
- java中的filter执行机理的一些细节。
- java 与c、c++的一些区别(基础)
- c#与java的区别
- java和C#访问修饰符的区别
- C#和Java中二维数组的区别
- C#语言粗浅认识和C#语言与Java的区别
- Java与C#中static field的区别