学习C#Java之后:探索了5个差异
#初学者 #java #csharp

Java和C#之间有许多相似之处 - 它们都是受C的影响的管理语言,但也有很多差异。在此博客文章中,我们将探讨Java开发人员在过渡到C#的一些关键区别。

1-语法糖

让我们探索C#提供的三个语言功能,以增强Java中不存在的代码可读性。这绝不是详尽的清单。

命名和可选参数
在C#中,您可以使用参数的名称按任意顺序指定该方法的参数。例如,考虑以下方法:

static void PrintHello(string name, string surname) =>
            Console.WriteLine($"Hello, {name} {surname}!");

以下结果在结果方面相同:

PrintHello("John", "Doe");
PrintHello(name: "John", surname: "Doe");
PrintHello(surname: "Doe", name: "John");

此外,您可以指定参数的默认值,在这种情况下,它将变为可选:

static void PrintHello(string value="World") =>
            Console.WriteLine($"Hello, {value}!");

static void Main(string[] args)
{
    PrintHello();
    PrintHello("Peggy");
}

获取/设置属性

C#中的属性是一个提供多功能方法来访问,修改或计算私有字段值的成员。它是带有特殊语法的Java的常规Getters/Setter的类似物,并且可以自动实施它们。

考虑以自动实施属性的以下示例:

class Student
{
    public string Name {get; init;}

    public string? Department {get; set;}
}

在这里,我们声明自动实施属性。 Name属性公开了GET属性,以及仅在方法初始化期间才能使用的设置器(init)。 Department属性既揭示了一个getter又一次固定器。然后,我们可以相应地访问和修改属性:

var student = new Student { Name = "Alice", Department = "Computer Science"};
student.Department = "Chemistry";
Console.WriteLine(student.Department);
Console.WriteLine(student.Name);

无效的(猫王)和无污染的操作员

与Java不同,C#支持Elvis(?.)和Null-Coalescing Operators(??)。这些运营商旨在简化可根据无效价值的工作。例如,这个代码块:

string department = null;
if (student != null) {
    department = student.Department;
}

可以替换为:

string department = student?.Department;

零污染操作员允许用val ?? defaultValue替换val != null ? val : defaultValue表达式。它也可以与猫王操作员组合使用,例如:

Console.WriteLine(student?.Department ?? "Value not known");

2-例外

在Java中,有所谓的检查和未检查的例外。在编译时检查了检查的异常,如果您使用抛出检查异常的方法,则必须在代码中处理它,否则不会编译。另一方面,未检查的例外不必在代码中处理。如果他们没有被抓住,他们会撞到他们扔掉的线程。

c#没有检查例外的概念,这始终取决于开发人员决定如何以及何时处理异常。

3- ienumerable&linq

C#中的IEnumerable接口是Java中Iterable接口的类似物。为了支持有关迭代对象的懒惰计算,Java 8引入了单独的流API。在C#中,直接通过Enumerable class提供了类似的功能。

这是使用枚举方法在c#中使用偶数均匀数字的示例:

IEnumerable<int> evenNums = Enumerable.Range(1, 1000)
                .Take(5)
                .Where(num => num % 2 == 0);

foreach (var num in evenNums)
{
    Console.WriteLine(num);
}

在Java中,相同的代码看起来像这样:

List<Integer> evenNums = Stream.iterate(1, i -> i + 1)
        .limit(5)
        .filter(num -> num % 2 == 0)
        .toList();

evenNums.forEach(System.out::println);

除了上面示例所示的查询方法的调用外,C#还提供语言集成查询(LINQ)功能。这是一项技术,可以直接在C#中的ienumberberberberberbers上使用查询语言。

在Linq风格的语法中,要过滤的示例将看起来像这样的示例:

var nums = new List<int> { 1, 2, 3, 4, 5 };

IEnumerable<int> evenNums = from num in nums
                                where num % 2 == 0
                                select num;

foreach (var num in evenNums)
{
    Console.WriteLine(num);
}

4-异步 /等待

c#提供异步/等待关键字,以更可读和顺序的方式编写异步代码。考虑以下示例,其中我们声明了一种异步方法,该方法在延迟2秒后会生成随机整数。我们首先调用该方法两次以生成两个随机整数,然后在需要打印总和时等待结果:

static async Task<int> RandomIntAsync()
{
    await Task.Delay(TimeSpan.FromSeconds(2));
    return new Random().Next(0, 100);
}

static async Task Main(string[] args)
{
    Task<int> val1 = RandomIntAsync();
    Task<int> val2 = RandomIntAsync();
    Console.WriteLine(await val1 + await val2);
}

您可以查看this blogpost我探索在c#和java中如何执行异步代码的差异的地方。

5-无效

c#将所有值类型变量视为默认情况下无法删除的变量。为了允许null值,必须将类型明确标记为可nullable,应该简单地将问号添加到类型定义(例如“ int?”)中。这使开发人员可以处理可能丢失或未定义的数据的情况,例如:

class Person
{
    public string Name { get; init; }

    public int? Age { get; init; }
}

static async Task Main(string[] args)
{
    var person = new Person { Name = "Bob"};
    if (person.Age == null)
    {
        Console.WriteLine("Age not specified.");
    }
}

除了无效的价值类型外,您还可以指定可无效的参考类型,就像我们在学生班级示例中所做的那样,在该示例中我们将部门字符串声明为nullable。从历史上看,在C#中,默认情况下所有参考都是无效的。但是,从C#8开始,除非明确说明,否则默认情况下,引用被认为是不可删除的,类似于价值类型的行为方式。由于具有向后兼容性的并发症,默认情况下未启用此功能。

结论

在这里,我们对C#和Java之间的一些主要区别(但不是全部)进行了简要概述。希望这可以在从Java转换为C#!

时提供一个起点