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#!
时提供一个起点