Skip to content

特性

语言特点

1.面向对象

C# 支持类、对象、继承、多态等面向对象的编程概念,使开发者能够编写模块化、可重用的代码。

2.强类型语言

C# 是一种强类型语言,意味着每个变量和表达式的类型在编译时就已经确定,有助于减少运行时错误。

3.跨平台

借助 .NET Core 和 .NET 5/6 等框架,C# 现在可以在 Windows、Linux 和 macOS 等多个平台上运行。

提示

在 2016 年 .NET Core 发布之前,C# 的主要开发平台是 Windows,依赖于 .NET Framework。虽然也有第三方的跨平台实现(如 Mono 和 Xamarin),但官方支持的跨平台能力是在 .NET Core 出现之后才开始正式广泛应用。

4.内存管理

C# 提供垃圾回收机制,自动管理内存分配和回收,减轻开发者的负担。

5.事件驱动

C# 支持事件驱动的编程模型,可以用于开发 Windows、WPF、异步编程等多种场景。

6.异步编程

C# 的异步编程提供了一种简洁、高效的方式来处理耗时操作,避免阻塞线程,尤其是在 I/O 密集型任务中。async 和 await 关键字的引入大大简化了异步代码的编写,使得异步操作的可读性和可维护性得到了显著提升。

7.语言集成查询 (LINQ)

语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。

对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。 查询表达式采用声明性查询语法编写而成。 使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。 可使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档和流以及 .NET 集合中的数据。

……

与Java对比

注意

以下仅代表个人观点,并不全面,请谨慎区分与选择.

Java独有的一些特性

1.匿名内部类

Java 支持匿名内部类,即使得可以在代码中声明和使用没有名字的类。C# 虽然也支持匿名类型和局部函数,但没有完全相同的匿名内部类特性。

匿名内部类通常用于简化代码和实现临时的接口或抽象类的子类。

举个简单的例子,在java中匿名内部类可用于实现回调机制。

Java
public class CallbackExample {
    interface Callback {
        void onComplete(String result);
    }
    public void performAction(Callback callback) {
        String result = "Task Completed";
        callback.onComplete(result);
    }
    public static void main(String[] args) {
        CallbackExample example = new CallbackExample();
        example.performAction(new Callback() {
            @Override
            public void onComplete(String result) {
                System.out.println("Callback received with result: " + result);
            }
        });
    }
}

而在c#中一般需要使用事件来实现,在一定程度上可能增加了代码的分散性,不易阅读。

C#
using System;
class Program
{
    public static event Action<string> OnTaskCompleted;
    public static void PerformAction()
    {
        string result = "Task Completed";
        OnTaskCompleted?.Invoke(result);
    }
    static void Main()
    {
        OnTaskCompleted += result => Console.WriteLine("Event received with result:" + result);
        PerformAction();
    }
}

2.已检查异常

在 Java 中,异常分为两大类:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。已检查异常是指在编译时被检查的异常,必须要么通过 try-catch 块处理,要么通过方法签名中的 throws 子句声明。

典型代表:常见的已检查异常包括 IOException、SQLException、ClassNotFoundException 等。

在 C# 中,理论上任何方法都可能引发任何异常。

3.已检查的数组协变

Java 中的数组协变指的是数组类型具有协变关系,也就是说,如果类型 B 是类型 A 的子类,那么类型 B[] 也是类型 A[] 的子类型。这种设计允许我们在使用父类型数组的地方替换为子类型数组。但是,数组的协变在运行时可能引发 ArrayStoreException。

在 C# 中,数组不是安全协变的。 如果需要协变结构,则应使用泛型集合类和接口。

C#独有的一些特性

1.模式匹配

模式匹配可以根据复杂数据结构的形状提供简洁的条件语句和表达式。

比如: is 语句可以用于类型检查和条件匹配,并且可以在匹配成功时直接声明和初始化一个新变量。

C#
object obj = "Hello, World!";
if (obj is string s)
{
    Console.WriteLine($"The string length is {s.Length}");
}

在这个例子中,is string s 不仅检查 obj 是否是 string 类型,还会将其转换并赋值给 s 变量

switch 语句自 C# 7.0 起支持模式匹配,可以基于类型和条件进行分支。

C#
object obj = 42;
switch (obj)
{
    case int i:
        Console.WriteLine($"Integer: {i}");
        break;
    case string s:
        Console.WriteLine($"String: {s}");
        break;
    case null:
        Console.WriteLine("Null object");
        break;
    default:
        Console.WriteLine("Other type");
        break;
}

2.字符串插值

字符串插值使你能够在字符串中插入已评估的表达式,而不是使用位置标识符。

3.可以为 null 的类型和不可为 null 的类型

C# 通过向类型附加 ? 后缀来支持可以为 null 的值类型和可以为 null 的引用类型。 对于可以为 null 的类型,如果在取消引用表达式之前不检查是否有 null,编译器会发出警告。 对于不可为 null 的类型,如果向该变量分配 null 值,编译器会发出警告。 不可为 null 的引用类型可最大程度减少引发 System.NullReferenceException 的编程错误。

4.扩展方法

在 C# 中,可以创建扩展类或接口的方法。 扩展方法可扩展库中某个类型的行为或实现给定接口的所有类型的行为。

5.LINQ

语言集成查询 (LINQ) 提供了一种通用语法来查询和转换数据,无论其存储方式如何。

6.事件和委托

语言集成查询 (LINQ) 提供了一种通用语法来查询和转换数据,无论其存储方式如何。

……

常见差异

1.类型系统

C#: 支持值类型和引用类型,提供了更丰富的类型系统,包括结构体(struct)、枚举(enum)以及自定义值类型。C# 中的 ref 和 out 参数允许引用传递。

Java: 主要使用引用类型,不支持值类型。Java 通过封装类(如 Integer、Double)实现原始类型的包装。

2.属性和方法

C#: 支持属性(properties),这是一种简化字段访问的方法。C# 的属性允许直接读取和写入字段,背后实际上使用了 getter 和 setter 方法。

Java: 不直接支持属性概念,通常通过 getter 和 setter 方法来实现字段访问。

3.方法重载

C#: 支持方法重载、运算符重载、和具名参数。

Java: 支持方法重载,但不支持运算符重载,也没有具名参数。

4.编译和运行

C#: 使用 csc 编译器,将代码编译成中间语言(IL),然后在运行时由 CLR 解释或编译为本地代码。

Java: 使用 javac 编译器,将代码编译成字节码(bytecode),然后由 JVM 执行。

……

如何选择

如果不用工作

选个P啊,我选择躺平。

面试Java岗位

Java生态完,分布式、大数据、服务监控……啥都有包,而且稳定。

C#毛都没有,实现个AOP都非半天劲,啥都得自己写。那么多特性用不到,都是糟粕。

我当然选Java。C#狗都不用。

面试C#岗位

.Net Core 优化了请求效率请求效率比Java效率高

Linq 优化了集合操作效率,计算效率比Java高(虽然Java有Stream编程,但相对Java,Linq还支持EF)

而且C#可以开发web,桌面应用,移动端。甚者可以写写C和C嘎嘎,一个人可以当成多个人用,节约学习成本。

至于生态,小型系统够用了。

我当然选C#。Java只会用轮子。

技术选型

稳定的大规模企业系统、大数据处理或分布式系统,选Java。(也可以选c#但相对Java三方库选择很少)

如果是企业内部系统,在Windows上运行的测试工具、调试工具,选C#,可以很好的兼容Windows平台。 (选Java也行,你要用Swing开发桌面程序也不是不可以)

如果现有技术栈是C\C++\C#,选C#可以节约成本。

如果现有技术栈是Java,选Java可以节约成本。

如果现在没有技术栈,需要从头搭建,选Java。因为有一大批毕业生和培训机构在卷Java。

写在最后

语言没有优劣之分,大多数情况下Java和C#都能满足开发需求,只是实现方式不同而已。

不要觉得用Java就有优越感,你所谓的优越感可能带不来丝毫好处。

不要觉得用C#就低人一等,挣钱不寒酸。

加油同志们!!!

Document Base on VitePress.