技术开发 频道

兄弟反目?细数Java中不能用的5大C#功能!

  【IT168 评论】C#和Java都源于C / C ++语言,两者在面向对象方面有很多共同之处。除Java的JVM和C#的.NET CLR结构有一些相似之外,两者各自的开发团队对语言优化关注点也不相同。今天主要讨论C#程序员在Java中无法使用的功能。

 兄弟反目?细数Java中不能用的C#功能!

  语言集成查询(LINQ)

  LINQ是2007年为查询数据来源引入C#中的。使用LINQ编写查询时不需要考虑正在调用的特定数据库的语法。LINQ提供一个组件将查询转换为基础源可读的格式。例如,当从SQL数据库查询时,LINQ to SQL把LINQ查询转换成T-SQL,这样查询起来会更容易。

  LINQ执行查询操作的一般步骤为:获取数据库——创建查询——执行。在LINQ to Object查询中,不需要为每个循环编写复杂的嵌套迭代,执行步骤就像读取代码一样简单。

  下面是用于从C#列表中过滤2位数字代码片。

  查询语法中不使用LINQ:

 兄弟反目?细数Java中不能用的C#功能!

  查询语法中使用LINQ:

兄弟反目?细数Java中不能用的C#功能!

  方法语法中使用LINQ:

兄弟反目?细数Java中不能用的C#功能!

  以上两种语法都是正确的,唯一的区别是查询语法看起来更像SQL,方法语法使用lambda表达式,看起来更像用Java编写的。

  LINQ依赖的诸如lambda许多特性都是有用的,Java中也可以实现。虽然我们可以使用stream和lambda来查询数据,但LINQ简化删除了Java中许多冗余部分。

  结构体(struct)

  C#中的结构体类似于类。实际上,一个结构体可以被认为是一个“轻量级类”,因为它本身包含构造函数、常量、方法等等。结构体和类之间最大的区别是结构是值类型,类是引用类型。

  创建类时编写结构体最大的好处是在构造一个值类型时比在构造引用类型时更容易确保值语义。正如微软所述:“struct类型的变量直接包含结构体的数据,而类类型的变量包含对数据的引用。” 因此,使用结构体的好处之一是从代码的其他部分改变其值的唯一方法是显示传递来作为参考。

  在一个类小于16字节,且是短暂不可变、不经常被打包的情况下,微软建议使用结构体代替类,因为这个类可能存储到堆栈而不是堆中。

  例如:

 兄弟反目?细数Java中不能用的C#功能!

  在许多情况下,编写结构体可以节省内存、缩短释放时间,因此,用结构体代替类是一种非常不错的选择。

  异步/等待

  在代码或其他地方调用异步,当代码达到等待时将继续运行。如果达到时异步代码还没有完成,就执行返回调用方法。需要注意的是,为了不阻挡当前线程,这种方法只能在单线程上执行。这种方法有助于提高应用程序的总体响应能力,减少性能瓶颈。使用异步编程对应用程序访问Web和所有与UI相关的活动都非常重要。与以往的异步编程相比,async / await不仅保留了代码的逻辑结构,而且编译器会帮助执行许多工作。

  例如:

 兄弟反目?细数Java中不能用的C#功能!

  输出结果:

兄弟反目?细数Java中不能用的C#功能!

  利用CompletableFutures可以在C#和Java中同时实现异步编程。但由于CompletableFutures太复杂不能与async / await关键字相匹配。

  Lazy<T> 类

  许多程序员使用C#或Java时都用到延迟初始化(或延迟实例化),延迟初始化一个比较常见的例子是,应用程序启动时加载对象,但最初只需要几个对象。在这种情况下,我们希望在需要的时候指示不必要的对象来初始化,以提高应用程序性能。

  引入lambda后Java 8实现延迟初始化更容易。但在C#中,我们使用提供了延迟初始化语义的任何类库或用户指定的类型的Lazy <T>wrapper类。

  关键字

  编程语言中的一些非常有用的功能,有时候并不是很显眼,比方说关键字。一些关键字在C#中存在,Java中却没有。

兄弟反目?细数Java中不能用的C#功能!

  1、 as

  当一个对象不能返回空值时,C#中的“as”会利用safe-cast将对象转换为类型。Java中的instanceof,如果类型匹配,则将布尔值返回true,不匹配,返回false。

  2、Yield

  C#中的yield 和return yield用于执行自定义和有状态的迭代,不需要显式额外的类,也无需创建临时集合。而在Java中实现迭代的非常好的选择是访问一个外部库或使用Java 8引入的lambdas。

  3、 var

  var是由编译器决定的隐式类型,但是在功能上相当于编写显式类型(即int,string等)。除节省额外按键外,var还允许在LINQ查询中使用最常用的匿名类型。Java SE 9中添加了的“var”标识符,它将使用初始化器扩展类型推断,声明局部变量。

  4、 Checked

  C#中的checked关键字用于对整形算术运算和转换显式启用溢出检查。如果某个表达式的结果值超出了目标类型范围,checked在运行时会强制抛出一个OverflowException。一般常量表达式在编译时有溢出检查,非常量表达式没有,这个关键字就显得更加有用了。

兄弟反目?细数Java中不能用的C#功能!

  工具

  Java和C#之间还有更多的区别,其中一些根植于Java和.NET框架中。这些区别导致了提供生产监视和错误跟踪的OverOps等工具在兼容性方面存在差异。OverOps向开发人员展示了整个调用堆栈中所有错误的完整源代码和变量状态,目前没有与.NET框架类似的功能。

0
相关文章