主页»ASP.NET»C# vs Java:C# 五个不行代替的特性瞬间秒杀 Java

C# vs Java:C# 五个不行代替的特性瞬间秒杀 Java

来历:oschina 发布时刻:2017-08-18 阅览次数:

  假如咱们能够一起具有 C# 和 Java 国际的最好特性,那会是什么样呢?

  完美的编程言语并不存在,我期望咱们能够在这一点上达到共同。开发新言语往往是为了战胜另一种言语的坏处,又不行避免的在某些方面上强健一些,却在另一些方面上存在缺乏。

  C# 与 Java 都起源于 C/C++ 言语,他们在面向方针方面有许多相似之处。除了 Java JVM 和 C# .NET CLR 有许多相同结构上的相似性之外,他们各自的开发团队都有各自的发展方向,他们重视的是各自的言语应该成为什么姿态。

  咱们并不想纠结于某一个言语比另一个言语好,咱们只想罗列出 C# 开发者能用到而 Java 中没有的那些特性罢了。

  下面咱们开端吧。

 1. LINQ

  LINQ (Language-Integrated Query,言语集成查询) 于 2007 年引进到 C#,以协助开发人员从各种数据源查询数据。运用它,咱们能够在无需考虑正在调用的特定数据库的语法来编写查询句子。LINQ provider 所供给的一个组件将查询转化为基层数据源可读的格局。例如,假如咱们需求从 SQL 数据库查询数据,LINQ to SQL provider 程序将把 LINQ 查询转化成 T-SQL,以便数据库能够了解它。

  要在 LINQ 中履行查询操作,首要获取数据库,然后创立查询,最终履行查询。在 LINQ to Object 查询中,这或许仅像相同代码相同简略,而不是为每个循环编写嵌套的杂乱迭代。

  例如,咱们来看看这个代码,用于在 C# 中从列表中过滤 2 位数。

  首要,在不运用 LINQ 的情况下:

List<int> FilterTwoDigitNumbersWithoutLinq(List<int> numbers)
{
    var tens = new List<int>();
    
    for (var i=0; i < numbers.Count(); i++)
    {
        if ((9 < numbers[i]) && (numbers[i] < 100))
        {
            tens.Add(numbers[i]);
        }
    }
    
    return tens;
}

  假如运用 LINQ 查询语法方式:

List<int> FilterTwoDigitNumbersWithLinq(List<int> numbers)
{
    return (from a in numbers
            where (a > 9 && a < 100)
            select a).ToList();
}

  或许是办法语法方式:

List<int> FilterNonTwoDigitNumbersWithLinq2(List<int> numbers)
{
    return numbers.Where(a => a > 9 && a < 100).ToList();
}

  这儿两种语法都是正确的,仅有的差异便是查询语法看起来更像是 SQL 句子而办法语法运用 lambda 表达式(当然,看起来很像咱们在 Java 里写的某些代码)

  总述:LINQ 所依靠的许多特性,如 lambda 表达式(就 LINQ 来说非常有用),现已在 Java 中有了等效的完结,虽然咱们能够运用流和 lambda 来查询数据,但 LINQ 简化了整个进程并且移除了许多在 Java 中存在的冗余代码。

 2. Struct

  C# 中的结构体类似于类。实践上,一个 struct 乃至能够被认为是一个“轻量级类”,由于它能够包含结构函数、常量、办法等等。一个结构体和一个类之间最大的差异在于结构是值类型,而类是引证类型。

  比较于创立类,编写结构体最重要的长处是在结构一个值类型时比在结构引证类型时更简单确保值语义。如 Microsoft 的文档所述,“struct 类型的变量直接包含结构体的数据,而类类型的变量包含对数据的引证。”因而,比照运用类时,运用结构体的长处之一是,从代码的其他部分更改其值的仅有办法是将其作为参阅进行显式传递。

  微软的开发人员主张关于那些小于 16 字节、生命周期短、不改动的并且不常装箱的类型,运用结构体(struct)而不是类(class)。在这种情况下,运用结构体或许会比运用类更有功率,由于它会保存在栈而不是堆中。

  比方:

public struct Point
    {
        public int X;
        public int Y;

        public Point(int X, int Y)
        {
            this.X = X;
            this.Y = Y;
        }

        public static Point operator +(Point p1, Point p2)
        {
            return new Point(p1.X + p2.X, p1.Y + p2.Y);
        }

        public override string ToString()
        {
            return ($"({X}, {Y})");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Point point1 = new Point(1, 5);
            Point point2 = new Point(2, 3);

            Console.WriteLine("The addition of both points will result in: {0}", (point1 + point2));

            Console.ReadKey();
        }
}

  小结:许多情况下运用结构体能够节约内存分配和开释的时刻,这的确很有吸引力。但是事实是值类型具有自己的存储空间。不管结构体具有怎么显着的长处和缺陷,这在 Java 中都不需求操心。

 3. Async/Await

  在一段代码中调用 async,或许更明确地调用办法,这个办法都会在另一个线程上履行,不会堵塞当时线程。当代码运转到 await 指令的时分,它会持续运转(await 的句子)。假如这时 async 代码还没有完结,那么履行中的程序会回来到调用点。

  这有助于进步应用程序整体的响应速度,以及削减功用瓶颈。在应用程序拜访 Web 和进行一切 UI 相关的活动时,运用异步程序非常重要。相关于曾经的异步编程完结,运用 async/await 能够保存你代码的逻辑结构,而编译器则会背负起曾经由开发者背负的重担。

  示例:

class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hey David, How much is 98745 divided by 7?");

            Task<int> david = ThinkAboutIt();

            Console.WriteLine("While he thinks, lets chat about the weather for a bit.");
            Console.WriteLine("Do you think it's going to rain tomorrow?");
            Console.WriteLine("No, I think it should be sunny.");

            david.Wait();
            var davidsAnswer = david.Result;

            Console.WriteLine($"David: {davidsAnswer}");

            Console.ReadKey();
        }

        private static async Task<int> ThinkAboutIt()
        {
            await ReadTheManual();

            Console.WriteLine("Think I got it.");

            return (98745 / 7);
        }

        private static async Task ReadTheManual()
        {
            string file = @"D:\HowToCalc.txt";

            Console.WriteLine("Reading a manual.");
            
            using (StreamReader reader = new StreamReader(file))
            {
                string text = await reader.ReadToEndAsync();
            }

            Console.WriteLine("Done.");
        }
}

  输出:

// Possible Output:

Hey David, How much is 98745 divided by 7?
Reading a manual.
While he thinks, lets chat about the weather for a bit.
Do you think it's going to rain tomorrow?
No, I think it should be sunny.
Done.
Think I got it.
David: 14106

  概要:CompletableFutures 无疑能够使咱们更趋近于具有等效于 C# 和 Java 所具有的异步编程中的才能。虽然如此,运用它所带来的杂乱性使其易费用不能与运用 async /await 关键字进行的完结混为一谈。

 4. Lazy<T> 类

  不管运用 C# 仍是 Java,许多人都现已完结了推迟初始化 (或实例化),因而方针要在第一次运用的时分才会被创立。有一种常见的比方是将推迟初始化用于应用程序发动的时分加载许多方针,但实践需求初始化的方针或许只要少量几个。这种情况下,咱们期望区分哪些是不需求在这儿初始化的。只初始化那些的确需求初始化的方针能够提高应用程序的功用。

  小结:最近,Lambda 表达式引进到 Java 8 之后,在 Java 中完结推迟加载(还有不少其它工作)变得更简单了。不过,在 C# 中咱们能够运用语义化的 Lazy<T> 封装类来推迟初始化任何类库或用户指定的类型。

 5. 一些等价的关键词

  言语中的有用功用不一定像在 C# 中的 LINQ 或 Java 中的模块相同大。这儿有一些能够协助 C# 开发人员的关键字,它们在 Java 中并没有:

  a. as

  C# 中的 as 关键字会测验安全地将方针转化为某个类型,假如不能转化的话,就回来 null。与 Java 的instanceof 简直同等,但它是一个布尔值,假如类型匹配则回来 true,不然回来 false。

  b. Yield

  在 C# 中运用  Yield 和 return yield 来进行自界说且状况化的迭代,不需求显式创立额定的类,也不需求创立暂时调集。在 Java 中咱们完结迭代最好的挑选是运用外部库或运用 Java 8 引进的 Lambda 表达式。

  c. var

  Var 是一种隐式类型,其实践类型由编译器决议,其功用相当于写一个显式类型 (比方 int, string 等)。它除了能够削减一些按键之外,var 还答应用于匿名类型,而匿名类型在 LINQ 中很常用。咱们等待看到“var”标识,备受瞩目的 Java SE 9 将完结“将类型推导扩展到界说并初始化局部变量时。”

  d. Checked

  C# 中,咱们运用 checked 关键字显式启用对整型表达式的溢出检查。假如表达式的运算成果超出方针类型的规模,咱们能够运用 checked 强制要求运转时抛出 OverflowException。这非常有用,由于常量表达式会在编译期进行溢出检查,而非常量表达式不会。

 东西生态系统

  Java 和 C# 之间存在许多的不同之外,当然,其间一些源于 Java 和 .NET 结构的不同。这些不同之处也导致了一些东西在兼容性方面的差异,比方 OverOps 在出产监控和过错盯梢方面的差异。

  OverOps 向开发者展现出产中每个过错整个调用栈的悉数源代码和变量状况。现在在 .NET 结构上并没有与之相同的内容,不过在接下来的几个月内会有一些改变。想了解更多信息,请点击这儿参加咱们 .NET Beta 的等候名单,假如你是 Java 开发者能够去 www.overops.com 检查演示。

 最终的考虑

  在快完毕时分,咱们这儿说到的大部分功用都在代码长度和简练程度方面临 C# 开发者有所协助,这些代码不能在 Java 中编写。事实上这些特性也或多或少阐明晰 Java 言语冗长的问题,包含最近版别更新带来的 Lambda 表达式。固然,许多这些存在于 C# 而不存在于Java 中的特性在惯例运用中供给了比运用 Lambda 更简练的语法。

  再次阐明,咱们不想卷进没完没了的关于哪种言更好的争辩,咱们仅仅在这儿指出两种言语之间的一些差异。咱们是否遗漏了某些你期望 Java 具有的特性?请在谈论中告知咱们!

  原文地址:http://blog.takipi.com/c-vs-java-5-irreplaceable-c-features-wed-kill-to-have-in-java/

QQ群:凯发娱乐官网官方群(515171538),验证音讯:10000
微信群:加小编微信 849023636 邀请您参加,验证音讯:10000
提示:更多精彩内容重视微信大众号:全栈开发者中心(fsder-com)
c#
188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
网友谈论(共0条谈论) 正在载入谈论......
沉着谈论文明上网,回绝歹意咒骂 宣布谈论 / 共0条谈论
登录会员中心