年度语言之--c#基础语法(一)

简介

本文章将介绍Java 8和C# 10.0(对应.NET 6.0)在语言特性/语法方面的差异。

如果你是具有经验的Java开发者,理解这些差异并不困难, 有针对性的学习两种语言之间的差异部分可以帮助我们更快的掌握c#.
我们将集中讨论两种语言在类型推断、属性与字段、扩展方法、以及Lambda表达式等方面的对比。


类型推断:var 关键字

Java 示例 - 类型推断

在Java 8中,var并不是关键字,而是在Java 10中引入。但即使在Java 8中,也可以通过编译器推断来实现类似的效果。例如:

List<String> list = new ArrayList<>(); // 编译器推断泛型类型
C# 示例 - 使用 var 进行类型推断

在C#中,var关键字从C# 3.0起就被用于局部变量的类型推断。它告诉编译器自动推断变量的类型。例如:

var number = 5; // number 被推断为 int
var message = "Hello World"; // message 被推断为 string
两种语言中 var 的使用

虽然Java和C#都支持类型推断,但它们在具体实现上有所不同。在Java中,类型推断主要用于泛型,如泛型类或方法的实例化,而在Java 10及以后版本中,var可以用于局部变量的类型推断,类似于C#。

C#的var关键字允许开发者编写更简洁的代码,同时保持类型安全(虽然var类型的语法类似js,但实际上仍然是由编译器推断出的强类型)。在类型关系复杂的局部代码中使用var关键字带来明显的好处,如LINQ查询或匿名类型。


属性(Properties)与字段

Java 示例 - 使用getter和setter方法管理字段

在Java中,字段通常是私有的(private),并通过公共的(public)getter和setter方法来访问和修改。这是一种封装数据的常见做法。例如:

public class Student {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这里,name字段被封装,只能通过getNamesetName方法访问和修改。

C# 示例 - 属性的声明和使用

C#中的属性是一种结合了字段和方法功能的语言特性。它们提供了一种简洁的方式来实现数据的封装。以下是一个C#中使用属性的例子:

public class Student
{
    public string Name { get; set; } // 自动实现的属性
}

在这个例子中,Name属性背后自动实现了一个私有字段,并提供了公共的getter和setter。
getter和setter也可以包含自定义逻辑 如进行空值检测等:

public class Student
{
    private string name;

    public string Name
    {
        get
        {
            // get访问器的自定义逻辑
            return name;
        }
        set
        {
            // set访问器的自定义逻辑,例如进行验证
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentException("Name cannot be null or empty.");
            }
            name = value;
        }
    }
}

C#属性与Java getter/setter的对比

C#的属性提供了一种更简洁的方式来封装数据,与Java中需要显式编写getter和setter方法相比,C#的自动实现属性减少了模板代码的需要。这使得代码更加简洁,同时保持了封装的好处。

虽然Java中也可以通过各种IDE自动生成getter和setter,但在源代码层面上,它们仍然存在。相反,C#的属性使得数据访问更加直接和清晰,而不牺牲封装性和安全性。


扩展方法

Java 示例 - 使用静态工具类

在Java中,通常通过静态工具类来添加对现有类的额外功能。例如,Apache Commons Lang 提供了 StringUtils 类,这是对 Java 标准库 String 类的扩展。以下是一个使用静态工具类的示例:

public class StringUtils {
    public static boolean isNullOrEmpty(String str) {
        return str == null || str.isEmpty();
    }
}

// 使用
boolean isEmpty = StringUtils.isNullOrEmpty("test");

这种方法在Java中非常常见,用于在不修改原有类的基础上提供额外的功能。

C# 示例 - 定义和使用扩展方法

在C#中,扩展方法是通过在静态方法的第一个参数前加上this关键字来定义的。这个this关键字指明了方法是在哪种类型上扩展的。扩展方法必须定义在静态类中。例如:

public static class StringExtensions {
    public static bool IsNullOrEmpty(this string str) {
        return string.IsNullOrEmpty(str);
    }
}

// 使用
bool isEmpty = "test".IsNullOrEmpty();

这里的IsNullOrEmpty方法通过在参数str前加上this关键字,表明这是一个在string类型上的扩展方法。这使得任何字符串实例都可以直接调用这个方法,就像它是字符串类的一部分一样。

C#中出现在形参列表的this关键字的作用

在C#的扩展方法中,this关键字是定义扩展方法的关键。它告诉编译器该方法可以作为扩展在指定类型的实例上调用。这种语法使得调用扩展方法就像调用实例本身的方法一样自然,从而提高了代码的可读性和易用性。

相比之下,Java中没有直接的扩展方法的概念。在Java中实现类似功能,通常需要创建一个静态工具类,并将原对象作为参数传递给静态方法。这种方式在语法上不如C#的扩展方法直观。

C#扩展方法的灵活性

C#中的扩展方法提供了一种非常灵活的方式来增强现有类型的功能。与Java中的静态工具类相比,扩展方法使得代码更加自然和易于阅读,因为它们允许以类似于实例方法的方式来调用。这种方式尤其适用于增加那些看起来应该属于对象本身的方法,但又不想或不能修改原始类的场景。

虽然Java的静态方法也能实现类似的功能,但C#的扩展方法提供了更直接和语义化的方式来增强现有类,使得代码的阅读和维护更加直观。


Lambda表达式

Java 示例 - Java 8中Lambda表达式的使用

Java 8引入了Lambda表达式,这是一种简洁的方式来实现只有一个方法的接口(如函数式接口)。Lambda表达式使得编写匿名方法变得更加简单和清晰。以下是Java中Lambda表达式的一个示例:

List<String> items = Arrays.asList("Apple", "Banana", "Cherry");
items.forEach(item -> System.out.println(item));

在这个例子中,forEach方法接受一个Lambda表达式作为参数,这个表达式定义了要对列表中每个元素执行的操作。

C# 示例 - C#中Lambda表达式的不同应用

C#中的Lambda表达式与Java类似,也是用于创建匿名方法的一种简洁方式。它们在LINQ查询、事件处理等许多场景中都非常有用。以下是C#中使用Lambda表达式的一个例子:

List<string> items = new List<string> { "Apple", "Banana", "Cherry" };
items.ForEach(item => Console.WriteLine(item));

在这个示例中,ForEach方法接受一个Lambda表达式,它定义了一个操作,该操作将应用于列表中的每个元素。

解释 - 两种语言中Lambda表达式的语法和使用场景

尽管Java和C#中的Lambda表达式在语法上非常相似,但它们在各自的语言环境中扮演着略有不同的角色。在Java中,Lambda表达式的引入是为了支持函数式编程,特别是与流(Streams)和集合的操作相结合。它们为Java这种传统的面向对象语言带来了更多的函数式编程能力。

在C#中,Lambda表达式已经存在了相当长的时间,并且被广泛用于各种场景,包括但不限于LINQ查询、事件处理、委托。C#的Lambda表达式紧密集成于语言的其他部分,如委托和表达式树,为各种高级功能提供支持。

总的来说,尽管两种语言中Lambda表达式的基本概念相同,但它们在各自语言的生态系统中有着各自独特的应用和集成方式。
在这里插入图片描述

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值