一、C# 语言核心基础
1.1 语法与类型系统
数据类型
- 值类型
- 整数类型:C# 提供了多种整数类型,如
byte
(8 位无符号整数,范围 0 - 255)、short
(16 位有符号整数)、int
(32 位有符号整数,最常用)、long
(64 位有符号整数)。在处理不同范围的整数时,选择合适的类型可以节省内存。例如,在处理文件大小(通常不会超过 2GB)时,使用int
类型即可;而在处理大整数时,如天文数据或大型数据库中的 ID,可能需要使用long
类型。 - 浮点类型:
float
(单精度浮点数,32 位)和double
(双精度浮点数,64 位)。float
适用于对精度要求不高的场景,如游戏中的坐标计算;而double
则用于需要更高精度的科学计算或金融计算中的某些中间结果。 - decimal 类型:具有 128 位的高精度,专门用于金融计算,能避免浮点数计算带来的精度损失。例如,在处理货币金额时,使用
decimal
类型可以确保计算结果的准确性。 - Nullable 类型:在 C# 8.0 及以后版本中引入,允许值类型可以为
null
。例如,int? age = null
表示年龄可能还未赋值。这在数据库查询结果处理中非常有用,因为数据库中的字段可能允许为空。
- 整数类型:C# 提供了多种整数类型,如
- 引用类型
- string 类型:表示文本数据,是不可变的。这意味着一旦创建了一个
string
对象,就不能修改它的内容。当对string
进行拼接等操作时,实际上是创建了一个新的string
对象。例如,string str1 = "Hello"; string str2 = str1 + " World";
这里str2
是一个新的string
对象。 - dynamic 类型:在 C# 4.0 引入,允许在运行时确定变量的类型。这在与动态语言(如 Python、JavaScript)交互或处理动态数据时非常有用。例如,使用
dynamic
类型可以调用动态对象的方法而无需在编译时知道其具体类型。 - object 类型:是所有类型的基类型,可以引用任何类型的对象。在需要处理不同类型的数据时,可以使用
object
类型作为通用的容器。但在使用时需要进行类型转换,可能会引发InvalidCastException
异常。
- string 类型:表示文本数据,是不可变的。这意味着一旦创建了一个
运算符
- 算术运算符:包括
+
(加法)、-
(减法)、*
(乘法)、/
(除法)、%
(取模)等。需要注意的是,整数除法会截断小数部分,例如5 / 2
的结果是 2。 - 比较运算符:
==
(等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于),用于比较两个值的大小关系,返回布尔值。 - 逻辑运算符:
&&
(逻辑与)、||
(逻辑或)、!
(逻辑非),用于组合布尔表达式。逻辑与和逻辑或运算符具有短路特性,即当第一个表达式的结果可以确定整个表达式的结果时,不会再计算第二个表达式。 - 位运算符:
&
(按位与)、|
(按位或)、^
(按位异或)、~
(按位取反)、<<
(左移)、>>
(右移),用于对整数类型的二进制位进行操作。 - 空合并运算符:在 C# 8.0 中引入,
??
用于在一个可空值为null
时提供一个默认值。例如,string name = person?.Name ?? "匿名用户";
表示如果person
对象的Name
属性为null
,则name
变量将被赋值为 "匿名用户"。 - 模式匹配:在 C# 9.0 及以后版本中得到了增强,允许根据对象的类型和值进行条件判断。例如,
if (obj is int i && i > 10) { ... }
表示如果obj
是int
类型且值大于 10,则执行相应的代码块。
1.2 面向对象编程
类与对象
- 类的定义:类是对象的蓝图,定义了对象的属性和方法。例如:
csharp
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Introduce()
{
Console.WriteLine($"我叫 {Name},今年 {Age} 岁。");
}
}
- 对象的创建:使用
new
关键字创建类的实例。例如:Person person = new Person { Name = "张三", Age = 20 }; person.Introduce();
- 记录类型:在 C# 9.0 中引入,是一种不可变的引用类型,用于表示不可变的数据。记录类型提供了自动生成的相等性比较、复制和解构方法。例如:
public record Person(string Name, int Age);
- 主要构造函数:在 C# 12 中引入,允许在类的定义中直接定义构造函数参数。例如:
csharp
public class Animal(string Name)
{
public string Species { get; init; }
}
继承与多态
- 继承:通过
:
符号实现类的继承,子类可以继承父类的属性和方法,并可以进行扩展或重写。例如:
csharp
public class Shape
{
public virtual double Area()
{
return 0;
}
}
public class Circle : Shape
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
public override double Area()
{
return Math.PI * Radius * Radius;
}
}
- 多态:允许通过基类的引用调用子类的方法,实现代码的灵活性和可扩展性。例如:
csharp
Shape shape = new Circle(5);
Console.WriteLine(shape.Area());
- 抽象类和接口:抽象类可以包含抽象方法,不能实例化,用于定义一组相关类的公共接口。接口则只包含方法签名,不包含实现,一个类可以实现多个接口。例如:
csharp
public abstract class Shape
{
public abstract double Area();
}
public interface IColorable
{
void SetColor(string color);
}
public class Rectangle : Shape, IColorable
{
public double Width { get; }
public double Height { get; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
public override double Area()
{
return Width * Height;
}
public void SetColor(string color)
{
Console.WriteLine($"将矩形颜色设置为 {color}。");
}
}
封装与访问修饰符
- 封装:将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。通过访问修饰符来控制类的成员(属性、方法等)的访问权限。
- 访问修饰符:
public
(公共的,任何地方都可以访问)、private
(私有的,只能在类的内部访问)、protected
(受保护的,只能在类的内部和子类中访问)、internal
(内部的,只能在同一个程序集内访问)、protected internal
(受保护的内部的,只能在同一个程序集内或子类中访问)。
二、.NET 生态核心技术
2.1 .NET 跨平台开发
工具链
- .NET CLI:是一个跨平台的命令行工具,用于创建、构建、运行和发布 .NET 应用程序。例如,使用
dotnet new webapi -o MyAPI
命令可以创建一个新的 ASP.NET Core Web API 项目。还可以使用dotnet build
命令构建项目,dotnet run
命令运行项目。 - Visual Studio 2025:是一个功能强大的集成开发环境(IDE),支持多种编程语言和开发平台。它提供了丰富的工具和功能,如代码编辑、调试、测试、版本控制等。在 Visual Studio 2025 中,支持热重载功能,允许在运行时修改代码并立即看到效果,提高开发效率。同时,还集成了 AI 辅助编程工具(如 GitHub Copilot),可以根据上下文自动生成代码。
- Visual Studio Code:是一个轻量级的代码编辑器,具有丰富的扩展生态系统。通过安装 C# 扩展,可以在 Visual Studio Code 中进行 C# 开发。它支持语法高亮、代码调试、智能提示等功能,适合快速开发和小型项目。
跨平台框架
- .NET MAUI:是一个跨平台的移动和桌面应用开发框架,允许使用 C# 和 XAML 一次编写代码,然后在 Android、iOS、macOS 和 Windows 等多个平台上运行。它提供了统一的用户界面控件和开发体验,大大减少了跨平台开发的工作量。例如,可以使用 .NET MAUI 开发一个简单的待办事项应用,在不同平台上具有一致的外观和功能。
- Blazor:是一个基于 .NET 的 Web 开发框架,允许使用 C# 编写客户端 Web 应用程序,而无需使用 JavaScript。Blazor 有两种渲染模式:服务器端渲染(Blazor Server)和客户端渲染(Blazor WebAssembly)。服务器端渲染将应用程序的逻辑运行在服务器上,通过 SignalR 与客户端进行通信;客户端渲染则将应用程序的代码下载到客户端浏览器中运行,提供更好的性能和离线支持。
2.2 云原生开发(.NET Aspire)
云服务配置
在 C# 12 中,可以使用 .NET Aspire 进行云服务的配置。例如:
csharp
var builder = DistributedApplication.CreateBuilder(args);
builder.AddProject<Projects.WebAPI>("webapi")
.WithExternalService("database", "postgresql:14-alpine");
这段代码表示创建一个分布式应用程序构建器,并添加一个 Web API 项目,同时指定该项目依赖于一个 PostgreSQL 数据库服务。
部署方案
- Docker:是一个开源的容器化平台,用于打包、分发和运行应用程序。可以使用 Dockerfile 定义应用程序的运行环境和依赖项,然后使用
docker build
命令构建 Docker 镜像,使用docker run
命令运行容器。例如,创建一个简单的 Dockerfile:
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "MyAPI.dll"]
然后使用 docker build -t myapp .
命令构建镜像。
- Kubernetes:是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。通过 .NET Aspire 可以自动生成 Kubernetes 部署所需的 YAML 文件,简化部署过程。例如,使用 Helm 包管理器可以更方便地部署和管理 Kubernetes 应用。
三、企业级开发实战
3.1 高并发系统设计
异步编程
- 异步方法:使用
async
和await
关键字实现异步编程。异步方法可以在执行耗时操作(如网络请求、文件读写)时不会阻塞当前线程,提高系统的并发性能。例如:
csharp
public async Task<string> GetDataAsync()
{
using (HttpClient client = new HttpClient())
{
return await client.GetStringAsync("https://example.com");
}
}
- 异步流:在 C# 8.0 中引入,允许异步生成和消费一系列值。例如:
csharp
public async IAsyncEnumerable<int> GetDataStreamAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(100);
yield return i;
}
}
// 使用异步流
await foreach (var item in GetDataStreamAsync())
{
Console.WriteLine(item);
}
分布式锁
- 基于 Redis 的分布式锁:Redis 是一个高性能的键值存储数据库,可以用于实现分布式锁。例如,使用 StackExchange.Redis 库实现分布式锁:
csharp
using StackExchange.Redis;
var connection = ConnectionMultiplexer.Connect("localhost");
var db = connection.GetDatabase();
var lockKey = "mylock";
var lockValue = Guid.NewGuid().ToString();
var lockAcquired = db.StringSet(lockKey, lockValue, TimeSpan.FromSeconds(30), When.NotExists);
if (lockAcquired)
{
try
{
// 执行临界区代码
}
finally
{
if (db.StringGet(lockKey) == lockValue)
{
db.KeyDelete(lockKey);
}
}
}
- 使用 Dapr 实现分布式锁:Dapr 是一个开源的分布式应用运行时,提供了分布式锁等多种分布式服务。例如:
csharp
using var lockHandle = await daprClient.TryAcquireLockAsync("mylock", "resourceId", TimeSpan.FromSeconds(30));
if (lockHandle != null)
{
try
{
// 执行临界区代码
}
finally
{
await daprClient.ReleaseLockAsync("mylock", "resourceId", lockHandle);
}
}
3.2 微服务架构
通信协议
- gRPC:是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。与传统的 RESTful API 相比,gRPC 具有更高的性能和更小的带宽占用。例如,定义一个简单的 gRPC 服务:
protobuf
syntax = "proto3";
package greet;
// 定义服务
service Greeter {
// 定义方法
rpc SayHello (HelloRequest) returns (HelloReply);
}
// 请求消息
message HelloRequest {
string name = 1;
}
// 响应消息
message HelloReply {
string message = 1;
}
然后在 C# 中实现该服务:
csharp
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
- 消息队列:用于实现微服务之间的异步通信,提高系统的可扩展性和可靠性。常见的消息队列有 RabbitMQ 和 Kafka。
- RabbitMQ:是一个功能强大的开源消息队列,支持多种消息协议和消息模式。例如,使用 RabbitMQ 实现生产者和消费者:
csharp
// 生产者
using RabbitMQ.Client;
using System.Text;
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
string message = "Hello, World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
// 消费者
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
- Kafka:是一个高吞吐量的分布式消息队列,适用于处理大规模的数据流。例如,使用 Confluent.Kafka 库实现 Kafka 生产者和消费者:
csharp
// 生产者
using Confluent.Kafka;
using System;
var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
using (var p = new ProducerBuilder<Null, string>(config).Build())
{
try
{
var dr = p.ProduceAsync("testtopic", new Message<Null, string> { Value = "Hello, Kafka!" }).Result;
Console.WriteLine($"Delivered '{dr.Value}' to '{dr.TopicPartitionOffset}'");
}
catch (ProduceException<Null, string> e)
{
Console.WriteLine($"Delivery failed: {e.Error.Reason}");
}
}
// 消费者
using Confluent.Kafka;
using System;
var config = new ConsumerConfig
{
GroupId = "test-consumer-group",
BootstrapServers = "localhost:9092",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using (var c = new ConsumerBuilder<Ignore, string>(config).Build())
{
c.Subscribe("testtopic");
CancellationTokenSource cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cts.Cancel();
};
try
{
while (true)
{
try
{
var cr = c.Consume(cts.Token);
Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
}
catch (ConsumeException e)
{
Console.WriteLine($"Error occured: {e.Error.Reason}");
}
}
}
catch (OperationCanceledException)
{
c.Close();
}
}
服务治理
- Polly:是一个 .NET 库,用于实现重试、熔断、超时等策略,提高系统的容错能力。例如,使用 Polly 实现重试策略:
csharp
var policy = Policy.Handle<HttpRequestException>()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
await policy.ExecuteAsync(async () =>
{
using (HttpClient client = new HttpClient())
{
var response = await client.GetAsync("https://example.com");
response.EnsureSuccessStatusCode();
}
});
- Ocelot:是一个开源的 API 网关,用于统一管理和路由微服务的请求。可以在 Ocelot 的配置文件中定义路由规则,将客户端的请求转发到相应的微服务。例如,在
ocelot.json
配置文件中定义路由:
json
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5000
}
],
"UpstreamPathTemplate": "/myapi/{everything}",
"UpstreamHttpMethod": [ "GET", "POST" ]
}
]
}
四、前沿技术与行业趋势
4.1 AI 与物联网集成
AI 开发
csharp
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Transforms.Image;
using System;
using System.IO;
// 定义数据模型
public class ImageData
{
[LoadColumn(0)]
public string ImagePath;
[LoadColumn(1)]
public string Label;
}
// 定义预测结果模型
public class ImagePrediction
{
[ColumnName("Score")]
public float[] Score;
[ColumnName("PredictedLabel")]
public string PredictedLabel;
}
class Program
{
static void Main()
{
var mlContext = new MLContext();
// 加载数据
var data = mlContext.Data.LoadFromTextFile<ImageData>("images.csv", hasHeader: true);
// 定义数据处理管道
var pipeline = mlContext.Transforms.LoadImages(
outputColumnName: "input",
imageFolder: "",
inputColumnName: nameof(ImageData.ImagePath))
.Append(mlContext.Transforms.ResizeImages(
outputColumnName: "input",
imageWidth: 224,
imageHeight: 224,
inputColumnName: "input"))
.Append(mlContext.Transforms.ExtractPixels(
outputColumnName: "input",
interleavePixelColors: true,
offsetImage: 117))
.Append(mlContext.Model.LoadTensorFlowModel("model.pb")
.ScoreTensorFlowModel(
outputColumnNames: new[] { "softmax2" },
inputColumnNames: new[] { "input" },
addBatchDimensionInput: true))
.Append(mlContext.Transforms.Conversion.MapKeyToValue(
outputColumnName: "PredictedLabel",
inputColumnName: "PredictedLabel"));
// 训练模型
var model = pipeline.Fit(data);
// 进行预测
var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model);
var imageData = new ImageData { ImagePath = "test.jpg" };
var prediction = predictionEngine.Predict(imageData);
Console.WriteLine($"预测结果: {prediction.PredictedLabel}");
}
}
- Azure Cognitive Services:是微软提供的一系列人工智能服务,包括计算机视觉、自然语言处理、语音识别等。可以使用 C# 调用这些服务的 API 进行开发。例如,使用 Azure Computer Vision 进行图像识别:
csharp
using Azure.AI.Vision.ImageAnalysis;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var endpoint = new Uri("https://your-endpoint.cognitiveservices.azure.com/");
var key = "your-key";
var client = new ImageAnalysisClient(endpoint, new Azure.AzureKeyCredential(key));
using (var fileStream = File.OpenRead("test.jpg"))
{
var analysisOptions = new ImageAnalysisOptions
{
Features = ImageAnalysisFeature.Caption
};
var result = await client.AnalyzeAsync(InputImage.FromStream(fileStream), analysisOptions);
if (result.Reason == ImageAnalysisResultReason.Analyzed)
{
var caption = result.Caption;
Console.WriteLine($"图像描述: {caption.Content}, 置信度: {caption.Confidence}");
}
else
{
Console.WriteLine($"分析失败: {result.Reason}");
}
}
}
}
物联网开发
- .NET Nano Framework:是一个开源的、跨平台的物联网开发框架,允许使用 C# 开发物联网设备。例如,使用 .NET Nano Framework 控制一个 Grove 继电器:
csharp
using Iot.Device.Grove;
using System.Device.Gpio;
using System.Threading;
class Program
{
static void Main()
{
var gpioController = new GpioController();
var relay = new GroveRelay(2, gpioController);
while (true)
{
relay.TurnOn();
Thread.Sleep(1000);
relay.TurnOff();
Thread.Sleep(1000);
}
}
}
- Azure IoT Hub:是微软提供的物联网云服务,用于连接、监控和管理物联网设备。可以使用 C# 开发物联网设备客户端和后端服务,与 Azure IoT Hub 进行通信。例如,使用 C# 开发一个简单的物联网设备客户端:
csharp
using Microsoft.Azure.Devices.Client;
using System;
using System.Text;
using System.Threading.Tasks;
class Program
{
private static DeviceClient deviceClient;
private const string DeviceConnectionString = "your-device-connection-string";
static async Task Main()
{
deviceClient = DeviceClient.CreateFromConnectionString(DeviceConnectionString, TransportType.Mqtt);
await SendDeviceToCloudMessagesAsync();
await deviceClient.CloseAsync();
}
private static async Task SendDeviceToCloudMessagesAsync()
{
double temperature;
double humidity;
Random rand = new Random();
while (true)
{
temperature = 20 + rand.NextDouble() * 15;
humidity = 60 + rand.NextDouble() * 20;
var telemetryDataPoint = new
{
temperature = temperature,
humidity = humidity
};
var messageString = Newtonsoft.Json.JsonConvert.SerializeObject(telemetryDataPoint);
var message = new Message(Encoding.ASCII.GetBytes(messageString));
await deviceClient.SendEventAsync(message);
Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, messageString);
await Task.Delay(1000);
}
}
}
4.2 元宇宙与游戏开发
Unity 引擎
- 游戏开发基础:Unity 是一个广泛使用的游戏开发引擎,支持 C# 脚本编程。可以使用 Unity 开发 2D 和 3D 游戏。例如,实现一个简单的角色移动脚本:
csharp
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f;
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontal, 0f, vertical) * speed * Time.deltaTime;
transform.Translate(movement);
}
}
- 资源管理与优化:在 Unity 中,需要合理管理游戏资源,如纹理、模型、音频等。可以使用 Unity 的资源管理工具(如 AssetBundle)来优化资源加载和内存使用。
- 网络同步:对于多人在线游戏,需要实现网络同步功能。可以使用 Unity 的网络模块(如 UNet 或 Mirror)来实现玩家之间的同步。
WebGL 部署
- 构建配置:在 Unity 中,可以将游戏项目部署为 WebGL 格式,以便在浏览器中运行。在构建项目时,需要进行一些配置,如选择 WebGL 平台、设置构建选项等。
bash
# 构建命令示例
unity-editor -batchmode -buildTarget WebGL -projectPath /path/to/project -executeMethod BuildScript.Build
- 性能优化:在 WebGL 部署中,需要注意性能优化,如压缩纹理、减少内存使用、优化代码等,以确保游戏在浏览器中能够流畅运行。
五、效率工具与最佳实践
5.1 开发工具推荐
工具名称 | 功能描述 |
---|---|
Resharper | 代码重构、代码质量分析,提供智能代码提示、代码格式化、代码导航等功能,帮助开发者提高代码质量和开发效率。 |
Postman | API 调试与文档生成,支持多种请求方式(如 GET、POST、PUT、DELETE),可以方便地测试 API 接口,并生成详细的 API 文档。 |
K6 | 性能测试工具,用于对 Web 应用程序、API 等进行性能测试,支持分布式测试和云测试,提供详细的性能报告。 |
SonarQube | 代码质量检测,分析代码中的漏洞、代码异味和复杂度等问题,提供可视化的代码质量报告,帮助团队提高代码质量。 |
JetBrains Rider | 是一款跨平台的 .NET IDE,集成了 Resharper 的功能,提供强大的代码编辑、调试和重构功能,支持多种编程语言和框架。 |
GitHub | 代码托管平台,支持版本控制和团队协作,提供丰富的代码管理和协作功能,如代码分支管理、拉取请求、代码审查等。 |
GitLab | 与 GitHub 类似,也是一个代码托管平台,同时提供了强大的 CI/CD 功能,支持自动化构建、测试和部署。 |
5.2 代码规范
命名约定
- 类名:使用 PascalCase 命名,即每个单词的首字母大写,如
OrderService
、CustomerRepository
。 - 方法名:使用 PascalCase 命名,如
CalculateTotal
、GetCustomerById
。 - 字段名:使用 camelCase 命名,以下划线开头,如
_repository
、_customerService
。 - 属性名:使用 PascalCase 命名,如
FirstName
、LastName
。 - 局部变量名:使用 camelCase 命名,如
customerName
、orderTotal
。
设计模式
- 单例模式:确保一个类只有一个实例,并提供一个全局访问点。例如:
csharp
public class Singleton
{
private static Singleton instance;
private static readonly object lockObject = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
- 工厂模式:定义一个创建对象的接口,让子类决定实例化哪个类。例如:
csharp
public interface IProduct
{
void Operation();
}
public class ConcreteProductA : IProduct
{
public void Operation()
{
Console.WriteLine("ConcreteProductA Operation");
}
}
public class ConcreteProductB : IProduct
{
public void Operation()
{
Console.WriteLine("ConcreteProductB Operation");
}
}
public class Factory
{
public IProduct CreateProduct(string type)
{
switch (type)
{
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new ArgumentException("Invalid product type");
}
}
}
- 观察者模式:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。例如:
csharp
public interface IObserver
{
void Update();
}
public interface ISubject
{
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify();
}
public class ConcreteSubject : ISubject
{
private List<IObserver> observers = new List<IObserver>();
private string state;
public string State
{
get { return state; }
set
{
state = value;
Notify();
}
}
public void Attach(IObserver observer)
{
observers.Add(observer);
}
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}
public class ConcreteObserver : IObserver
{
private string name;
private ConcreteSubject subject;
public ConcreteObserver(string name, ConcreteSubject subject)
{
this.name = name;
this.subject = subject;
subject.Attach(this);
}
public void Update()
{
Console.WriteLine($"{name} 收到通知,新状态为: {subject.State}");
}
}
代码注释与文档生成
- XML 注释:在 C# 中,可以使用 XML 注释为代码添加文档注释。例如:
csharp
/// <summary>
/// 计算两个整数的和。
/// </summary>
/// <param name="a">第一个整数。</param>
/// <param name="b">第二个整数。</param>
/// <returns>两个整数的和。</returns>
public int Add(int a, int b)
{
return a + b;
}
- 文档生成工具:可以使用工具(如 Sandcastle、DocFX 等)将 XML 注释生成 HTML 文档,方便团队成员和其他开发者查看代码文档。
六、学习资源与成长路径
6.1 书籍推荐
书籍名称 | 适用阶段 | 核心价值 |
---|---|---|
《CLR via C#》 | 中级 | 深入理解 .NET 底层机制,包括内存管理、类型系统、线程同步等,帮助开发者写出高效、稳定的代码。 |
《Effective C#》 | 高级 | 介绍 50 条 C# 最佳实践,涵盖语言特性、性能优化、代码设计等方面,提升开发者的编程水平。 |
《云原生架构》 | 架构师 | 讲解微服务与云原生设计的原理和方法,包括容器化、编排、服务网格等,帮助架构师设计和构建云原生应用。 |
《C# 高级编程》 | 初级到中级 | 全面介绍 C# 语言的特性和应用,包括面向对象编程、异步编程、LINQ 等,适合初学者入门和中级开发者深入学习。 |
《ASP.NET Core 实战》 | 中级到高级 | 详细介绍 ASP.NET Core 的开发,包括 Web API、MVC、Razor Pages 等,结合实际项目案例,帮助开发者掌握 ASP.NET Core 的开发技巧。 |