1. C#语言概述与核心特性
C#(读作C Sharp)是微软在2000年推出的一种面向对象的编程语言,作为.NET框架的主力语言,它融合了C++的强大功能和Java的简洁特性。经过20多年的发展,C#已经从最初的Windows桌面应用开发语言,成长为跨平台、多场景的全能型编程语言。
C#最显著的特点是它的强类型特性。与JavaScript等动态语言不同,C#在编译时就会检查类型安全,这大大减少了运行时错误。例如,当你声明一个整数变量后尝试赋值为字符串,编译器会直接报错:
csharp复制int number = 10;
number = "hello"; // 编译错误:无法将字符串转换为int
C#的另一个核心特性是垃圾自动回收机制(GC)。开发者不需要手动管理内存分配和释放,CLR(公共语言运行时)会自动处理不再使用的对象内存回收。这使得开发者可以更专注于业务逻辑,而不用像C++那样担心内存泄漏问题。
在最新版本中(C# 12),语言特性持续增强,包括:
- 主构造函数:简化了需要初始值的类的定义
- 集合表达式:更简洁的集合初始化语法
- 内联数组:提升性能敏感场景的效率
- 默认Lambda参数:使函数式编程更加方便
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C#开发环境搭建与基础项目创建
2.1 Visual Studio 2022安装与配置
作为C#开发的首选IDE,Visual Studio 2022提供了最完善的开发体验。安装时需要注意以下几点:
- 工作负载选择:确保勾选".NET桌面开发"和"ASP.NET和Web开发"(根据项目需求)
- 组件选择:对于数据库开发,建议添加"SQL Server数据工具"
- 安装位置:SSD硬盘能显著提升编译和调试速度
安装完成后,首次启动建议进行以下配置:
- 工具→选项→环境→字体和颜色:调整编辑器字体大小(推荐Consolas 12pt)
- 工具→选项→文本编辑器→C#→高级:启用"显示实时语义错误"
- 工具→选项→调试→常规:禁用"仅我的代码"以便查看所有调用堆栈
2.2 创建第一个控制台应用
通过"文件→新建→项目",选择"控制台应用"模板,注意:
- 项目名称:避免空格和特殊字符
- 位置:建议使用较短的路径(长路径可能导致NuGet包管理问题)
- 框架版本:新项目建议选择.NET 8.0(长期支持版本)
生成的项目包含一个Program.cs文件,基础结构如下:
csharp复制// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
2.3 项目结构解析
典型的C#解决方案包含以下关键元素:
- Properties/AssemblyInfo.cs:程序集元数据(版本、作者等)
- appsettings.json:配置文件(ASP.NET Core项目)
- Program.cs:主入口文件
- 依赖项:包含NuGet包和项目引用
提示:在解决方案资源管理器中点击"显示所有文件"按钮,可以查看obj/bin等隐藏目录,有助于理解构建过程。
3. C#核心语法与面向对象编程
3.1 类型系统与变量
C#的类型系统分为值类型和引用类型:
- 值类型:直接存储数据(int, double, struct等)
- 引用类型:存储数据引用(class, interface, delegate等)
变量声明示例:
csharp复制int age = 30; // 值类型
string name = "John"; // 引用类型
3.2 类与对象
类是C#面向对象编程的基础单元。一个完整的类定义通常包含:
- 字段:存储对象状态
- 属性:控制字段访问
- 方法:定义行为
- 构造函数:初始化对象
csharp复制public class Person
{
// 字段
private string _name;
// 属性
public string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException(nameof(value));
}
// 构造函数
public Person(string name)
{
Name = name;
}
// 方法
public void Greet()
{
Console.WriteLine($"Hello, {Name}!");
}
}
3.3 继承与多态
继承允许创建层次化的类结构:
csharp复制public class Employee : Person
{
public decimal Salary { get; set; }
public Employee(string name, decimal salary) : base(name)
{
Salary = salary;
}
// 方法重写
public override void Greet()
{
base.Greet();
Console.WriteLine($"My salary is {Salary}");
}
}
多态性使得可以通过基类引用调用派生类的方法:
csharp复制Person p = new Employee("Alice", 5000);
p.Greet(); // 调用Employee的Greet方法
3.4 接口与抽象类
接口定义契约而不提供实现:
csharp复制public interface ILogger
{
void Log(string message);
}
抽象类可以提供部分实现:
csharp复制public abstract class Shape
{
public abstract double Area();
public void Display()
{
Console.WriteLine($"Area: {Area()}");
}
}
4. 高级C#特性与应用
4.1 泛型编程
泛型允许编写可重用、类型安全的代码:
csharp复制public class GenericList<T>
{
private T[] items;
private int count;
public GenericList(int capacity)
{
items = new T[capacity];
}
public void Add(T item)
{
if (count == items.Length)
Array.Resize(ref items, items.Length * 2);
items[count++] = item;
}
public T this[int index] => items[index];
}
使用示例:
csharp复制var intList = new GenericList<int>(10);
intList.Add(42);
Console.WriteLine(intList[0]);
4.2 委托与事件
委托是类型安全的函数指针:
csharp复制public delegate void Notify(string message);
public class Publisher
{
public event Notify OnNotify;
public void DoSomething()
{
// 某些操作...
OnNotify?.Invoke("Operation completed");
}
}
使用Lambda表达式简化事件处理:
csharp复制var pub = new Publisher();
pub.OnNotify += msg => Console.WriteLine($"Notification: {msg}");
pub.DoSomething();
4.3 LINQ查询
LINQ(Language Integrated Query)提供了统一的数据查询方式:
csharp复制var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = from n in numbers
where n % 2 == 0
select n;
// 方法语法
var squares = numbers.Select(n => n * n);
4.4 异步编程
async/await模式简化了异步操作:
csharp复制public async Task<string> DownloadContentAsync(string url)
{
using var client = new HttpClient();
return await client.GetStringAsync(url);
}
// 调用
var content = await DownloadContentAsync("https://example.com");
5. C#实际应用场景
5.1 桌面应用开发(WPF)
WPF(Windows Presentation Foundation)是创建现代Windows桌面应用的首选框架。关键概念包括:
- XAML:声明式UI设计语言
- 数据绑定:连接UI与业务逻辑
- MVVM模式:分离关注点
简单WPF窗口示例:
xml复制<!-- MainWindow.xaml -->
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox x:Name="InputBox" Margin="5"/>
<Button Content="Click Me" Click="Button_Click" Margin="5"/>
<TextBlock x:Name="OutputText" Margin="5"/>
</StackPanel>
</Window>
csharp复制// MainWindow.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
OutputText.Text = $"You entered: {InputBox.Text}";
}
5.2 Web开发(ASP.NET Core)
ASP.NET Core是跨平台的Web框架。创建WebAPI项目:
csharp复制var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
控制器示例:
csharp复制[ApiController]
[Route("[controller]")]
public class WeatherController : ControllerBase
{
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55)
})
.ToArray();
}
}
5.3 数据库操作(Entity Framework Core)
EF Core是ORM框架,简化数据库访问:
csharp复制public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=blogging.db");
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; } = new();
}
// 使用示例
using var db = new BloggingContext();
db.Blogs.Add(new Blog { Url = "http://example.com" });
db.SaveChanges();
var blogs = db.Blogs.Include(b => b.Posts).ToList();
5.4 上位机开发与硬件交互
C#在工业自动化中常用于开发上位机软件,与PLC等设备通信:
csharp复制// Modbus TCP通信示例
using var client = new ModbusFactory().CreateMaster(new TcpClientAdapter("192.168.1.10", 502));
ushort[] holdingRegisters = client.ReadHoldingRegisters(0, 10, 5);
// 串口通信示例
using var serialPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
serialPort.Open();
serialPort.Write("AT+COMMAND\r\n");
string response = serialPort.ReadExisting();
6. 性能优化与调试技巧
6.1 性能分析工具
Visual Studio内置的性能分析器(Alt+F2)提供:
- CPU使用率分析
- 内存分配跟踪
- 热路径识别
6.2 常见性能陷阱
- 字符串拼接:使用StringBuilder替代大量+操作
- 装箱拆箱:避免值类型与object之间的频繁转换
- 过度分配:注意闭包捕获和LINQ的中间对象创建
6.3 多线程编程
使用Task Parallel Library(TPL)简化并行编程:
csharp复制Parallel.For(0, 100, i =>
{
Console.WriteLine($"Processing {i} on thread {Thread.CurrentThread.ManagedThreadId}");
});
// 使用锁保护共享资源
private static readonly object _lock = new object();
lock (_lock)
{
// 临界区代码
}
6.4 异常处理最佳实践
- 只捕获你能处理的异常
- 使用特定异常类型而非通用的Exception
- 避免在循环中使用try-catch
- 考虑使用Exception过滤器(when子句)
csharp复制try
{
// 可能失败的代码
}
catch (IOException ex) when (ex.Message.Contains("network"))
{
// 只处理网络相关的IO异常
}
7. 现代C#开发实践
7.1 单元测试(xUnit)
csharp复制public class CalculatorTests
{
[Fact]
public void Add_TwoNumbers_ReturnsSum()
{
// Arrange
var calc = new Calculator();
// Act
var result = calc.Add(2, 3);
// Assert
Assert.Equal(5, result);
}
}
7.2 依赖注入
ASP.NET Core内置DI容器:
csharp复制builder.Services.AddScoped<IEmailService, SmtpEmailService>();
手动使用DI:
csharp复制var services = new ServiceCollection();
services.AddTransient<MyService>();
var provider = services.BuildServiceProvider();
using var scope = provider.CreateScope();
var service = scope.ServiceProvider.GetRequiredService<MyService>();
7.3 源代码生成器
创建自动生成代码的源生成器:
csharp复制[Generator]
public class HelloWorldGenerator : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
string source = @"// <auto-generated/>
public static class HelloWorld
{
public static void SayHello() => System.Console.WriteLine(""Hello from generated code!"");
}";
context.AddSource("HelloWorld.g.cs", source);
}
}
7.4 跨平台开发(.NET MAUI)
使用.NET MAUI创建跨平台移动和桌面应用:
csharp复制public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void OnCounterClicked(object sender, EventArgs e)
{
CounterLabel.Text = $"Clicked {++count} times";
SemanticScreenReader.Announce(CounterLabel.Text);
}
}
