C#基础
作为一名JAVA工程师,转向C#开发是一个相对平滑的过程,因为两者都是强类型、面向对象的语言,语法结构(如类、接口、继承、多态)高度相似,许多概念可以直接映射(如JAVA的ArrayList对应C#的List<T>)。然而,C#属于.NET生态系统,有独特的特性(如属性、委托、LINQ查询)和工具链(如Visual Studio),需要重点学习差异点。根据相关资源,过渡期通常只需几周到几个月,取决于你的实践深度。路线以实践导向为主,建议边学边构建小项目(如从JAVA的控制台应用转换为C#版本)来强化理解。
JDK对比CLR
开发工具包(JDK vs .NET SDK)、运行时环境(JRE vs CLR)、以及执行引擎(JVM vs CLR执行引擎)
| 功能 | CLR(.NET) | JRE(Java) |
|---|---|---|
| 代码执行 | JIT 编译 IL 为机器码 | JIT 编译字节码为机器码 |
| 内存管理 | 自动垃圾回收(GC) | 自动垃圾回收(GC) |
| 多语言支持 | 支持 C#、VB.NET、F# 等多种语言 | 主要支持 Java |
| 跨平台 | 通过 .NET Core / Mono 实现跨平台 | 通过 JVM 实现跨平台 |
CLR 类似于 JRE + JVM 的组合,但扩展了多语言支持能力,
JDK(Java Development Kit)和 JRE(Java Runtime Environment)对应的核心组件是 CLR(Common Language Runtime) 及其配套的开发工具包(.NET SDK)。
CLR(公共语言运行时)管理内存、垃圾回收,确保代码安全执行:作为 .NET 的核心运行时环境,负责执行编译后的中间语言(IL 或 CIL),提供内存管理(垃圾回收)、类型安全、异常处理、线程管理和安全性等基础服务
| 开发工具 | .NET SDK | JDK |
|---|---|---|
| 编译器 |
|
|
| 运行时 | CLR | JRE(含 JVM) |
| 打包工具 |
|
|
| 调试工具 | VS Debugger / |
|
安装 .NET SDK 后即包含 CLR,无需单独安装运行时(类似 JDK 包含 JRE)
.NET SDK:包含编译器(如 csc编译 C# 代码)、CLR、基础类库、调试工具(如 VS Code 集成)、打包工具(如 dotnet publish)和文档生成工具。开发者需安装 SDK 以编写和构建应用
| 层级 | Java 生态 | .NET 生态 |
|---|---|---|
| 开发工具包 | JDK | .NET SDK |
| 运行时环境 | JRE(含 JVM) | CLR |
| 中间语言 | 字节码(Bytecode) | 中间语言(IL/CIL) |
| 核心虚拟机 | JVM | CLR 执行引擎(JIT 编译) |
| 跨平台实现 | JVM 多平台移植 | .NET Core / Mono |
开发工具
-
Visual Studio:功能全面的IDE,适合大型项目(Windows/Mac)
-
VS Code:轻量跨平台,需安装C#扩展
微软的IL反编译工具(ildasm.exe)
安装Visual Studio或.NET SDK后,工具位于默认路径:
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe

加载程序集:
-
打开ILDASM → 菜单栏点击 File → Open → 选择目标文件(如
MyApp.dll)
C# 类文件(.cs)的核心结构
C# 的类文件(以 .cs 为扩展名)是源代码文件,用于定义类的结构、成员和行为,其核心结构围绕 “类的声明” 和 “类的成员” 展开。以下是 C# 类文件的典型结构整理,按代码编写的常规顺序排列:
| 层级 | 组成部分 | 说明与示例 |
|---|---|---|
| 1. 引用命名空间 | using 指令 | 引入外部命名空间,避免代码中写全限定名(如 using System;)。 |
| 2. 命名空间声明 | namespace | 组织代码的逻辑容器,避免类名冲突(如 namespace MyApp.Models;)。 |
| 3. 类声明 | 类的定义 | 包含访问修饰符、类名、继承 / 实现关系(如 public class User : IComparable)。 |
| 4. 类的成员 | 字段(Fields) | 类的私有数据存储(如 private string _name;)。 |
| 属性(Properties) | 封装字段,提供访问控制(如 public string Name { get; set; })。 | |
| 构造函数(Constructors) | 初始化对象(与类名相同,如 public User(string name) { _name = name; })。 | |
| 方法(Methods) | 类的行为逻辑(如 public void PrintInfo() { ... })。 | |
| 索引器(Indexers) | 允许类像数组一样被访问(如 public string this[int index] { get; set; })。 | |
| 事件(Events) | 定义通知机制(如 public event Action OnUpdated;)。 | |
| 嵌套类型(Nested Types) | 类内部定义的类型(如 public enum Gender { Male, Female })。 | |
| 5. 特性与注释 | 特性(Attributes) | 附加元数据(如 [Serializable] public class User { ... })。 |
| XML 注释 | 生成文档(如 /// <summary>用户类</summary>)。 |
基础语法与差异对比
变量声明、循环(for/while/foreach)、条件语句(if/switch)、异常处理(try-catch-finally,与JAVA的try-with-resources类似但C#用using语句都相似。
1. 属性(Properties):C#用get/set访问器替换JAVA的getter/setter方法。
1.1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyFirstConsoleApp.Model
{
internal class Order
{
public int Id { get; set; }
public string Name { get; set; }
public string Amount { get; set; }
}
}
class Person {
public string Name { get; set; }
public void Introduce() => Console.WriteLine($"Hi, I'm {Name}");
}
Person alice = new Person { Name = "Alice" };
alice.Introduce(); // 输出:Hi, I'm Alice [3,4](@ref)
1.2基础数据类型及异常处理
try
{
int age = int.Parse(Console.ReadLine());
if (age >= 18)
{
Console.WriteLine("你已经成年");
}
else
{
Console.WriteLine("你还未成年");
}
}
catch (Exception)
{
throw new NullReferenceException();
}
2. 泛型(Generics):C#支持协变/逆变,约束更灵活(如where T : class)。
常见约束举例:
| 约束语法 | 说明 | 示例 |
|---|---|---|
where T : struct | T 必须是值类型(不能为 null) | class NumberContainer<T> where T : struct |
where T : new() | T 必须有公共无参构造函数(与其他约束共存时放最后) | class Factory<T> where T : new() |
where T : 基类名 | T 必须继承自指定基类 | class StudentContainer<T> where T : Person |
where T : 接口名 | T 必须实现指定接口 | class DataHandler<T> where T : IDisposable |
where T : U | T 必须是 U 的派生类型(用于多参数约束) | class MyClass<T, U> where T : U |
- 协变(out):允许
派生类型泛型 → 基类型泛型转换,适用于返回值场景(如集合读取)。 - 逆变(in):允许
基类型泛型 → 派生类型泛型转换,适用于参数场景(如比较器)。 - 泛型约束:通过
where限制 T 的范围,where T : class确保 T 是引用类型,增强代码安全性和可读性。
3.委托与事件(Delegates & Events):C#的函数指针类似JAVA的Lambda,但更强大,用于事件驱动编程。
4.值类型 vs 引用类型:C#有struct(值类型),类似于JAVA的原始类型,但可自定义。
5.字符串处理:C#的string interpolation ($"Hello {name}") 比JAVA的String.format更简洁。
6.集合框架:List<T>、Dictionary<TKey, TValue> 等,与JAVA的ArrayList、HashMap类似,但C#有更多LINQ扩展。
7.C#的引用类型 vs JAVA的原始类型包装
泛型/委托/事件/Ling
8.ADO.NET入门/5大对象
Connection对象:管理数据库连接
Command对象:执行SQL命令
DataAdapter对象:在数据库和DataSet之间桥接
DataSet对象:内存中的数据库
DataReader对象:高效读取数据流
.NET生态与工具链
熟悉C#的运行环境和开发工具,理解从JAVA的JVM到.NET的CLR(Common Language Runtime)的转变
9..NET框架:学习.NET Core/.NET 8(跨平台,与JAVA的跨平台类似,但支持更多OS)。理解项目结构:.csproj文件(类似pom.xml或build.gradle),解决方案文件(.sln)。
10.构建与包管理:用dotnet CLI命令(dotnet build/run/publish)替换JAVA的Maven/Gradle;NuGet包管理器类似Maven仓库。
11.IDE工具:Visual Studio(免费Community版)或Visual Studio Code + C#扩展。学习调试、IntelliSense(比Eclipse/IntelliJ更智能的代码补全)。
12.常见库:System.Collections.Generic、System.Linq(LINQ查询,类似JAVA Stream但更集成)。
13.差异:C#无checked exceptions(所有异常均为unchecked);垃圾回收类似但C#有更多手动控制(如IDisposable)。
高级特性与应用开发
14. LINQ**:查询语法,类似SQL,用于集合操作(JAVA Stream的增强版)。
15. 异步编程**:async/await关键词,处理I/O操作,比JAVA的CompletableFuture更直观。
16. Lambda与函数式编程**:扩展方法、表达式树。
17.应用类型:
Web:ASP.NET Core(MVC/API),类似Spring Boot。
Desktop:WinForms/WPF/MAUI,类似Swing/JavaFX。
其他:Unity游戏开发(如果感兴趣),或Entity Framework ORM(类似Hibernate)。
测试与最佳实践**:xUnit/NUnit测试框架;设计模式在C#中的实现(如依赖注入)。
18.理解C#的unsafe代码、Span<T>等高级内存管理(JAVA无直接等价物)。
19.JAVA代码转换为C#,处理兼容性(如JSON序列化用Newtonsoft.Json)
Winform基础
1.Winform项目介绍
2.程序结构详解
| 配置文件类型 | 主要作用 | 备注 |
|---|---|---|
| | 存储应用程序的运行时常量设置(连接字符串、应用设置等)。 | 应用程序的核心配置文件。 |
| | 管理项目的NuGet包依赖,记录包ID和版本。 | 旧版管理方式,现代项目已用 |
| | 在.NET Core/.NET 5+项目中替代 | 采用更流行的JSON格式,是当前的主流。 |
C# 项目中的 .config文件(特别是 App.config/Web.config)核心作用上确实类似于 Java 项目中常用的 properties文件、yml/yaml文件(如 Spring Boot 的 application.properties或 application.yml)。
packages.config 与 java项目中的Maven或者Gradle相似
-
依赖管理:它记录了项目的所有外部依赖(第三方库),确保任何获取此项目代码的人都能通过
packages.config快速还原这些依赖。 -
版本控制:明确指定每个包的确切版本,保证了项目在不同机器上构建时的一致性。
-
与NuGet集成:Visual Studio和NuGet命令行工具会读取这个文件来安装、恢复或更新包。
| 功能/特点 | C# (传统 .NET Framework) | Java (典型如 Spring Boot) | 说明 |
|---|---|---|---|
| 主要配置文件 |
|
| 都是项目根目录下的主配置文件。 |
| 格式 | XML |
| C# 传统用 XML,Java 常用 properties 或更结构化的 YAML。现代 C# (.NET Core+) 也转向了 JSON。 |
| 核心目的 | 外部化配置 | 外部化配置 | 将数据库连接、服务地址、功能开关、日志级别等配置移出代码。 |
| 环境差异化 | 使用 | 使用 | 都支持为不同环境(开发、测试、生产)提供不同的配置文件。 |
| 读取方式 | 通过 | Spring 的 | 框架提供机制读取配置值并注入到代码中。 |
| 典型配置项 |
|
| 都包含数据库连接、服务器设置、应用特定参数等。 |
| 无需重新编译 | ✅ 修改配置文件后重启应用生效 | ✅ 修改配置文件后重启应用生效 (部分支持热加载) | 修改配置通常不需要重新编译代码。 |
| 现代演变 | .NET Core / .NET 5+: | Spring Boot: 优先使用 |
C# 项目中的 .config文件(尤其是其承载的配置功能)本质上等同于 Java 项目中的 properties文件或 yml/yaml文件。它们都是实现外部化配置这一核心需求的关键手段。
C# (.NET Core 及更高版本) ,更倾向于使用 appsettings.json这种 JSON 格式的配置文件,其作用和用法与 Spring Boot 的 application.yml更加相似,都代表了当前配置管理的流行实践。
4338

被折叠的 条评论
为什么被折叠?



