首页 程序笔记 .NET C# 开发常用的10种设计模式

.NET C# 开发常用的10种设计模式

设计模式是软件设计中出现的常见问题的可重用解决方案。它们是用于解决设计问题的模板,这些设计问题已被证明在各种情况下都是有效的。它们为开发人员提供了通用词汇和对最佳实践的共同理解,使他们更容易就复杂的设计问题进行沟通和协作。总而言之,它们很重要,因为它们:为常见设计问题提供经过验证的解决方案促进开发人员之间的共同词汇和共识节省创建解决方案的时间和精力推广模块化和可维护的代码库适用于各种设计问题,不受平台或语言限制。设计模式并不特定于任何编程语言或技术。它们适用于任何软件开发项目,无论使用何种平台或语言。单例模式单一实例模式是一种设计模式,它将类限制为只有一个实例,同时提供对此实例的全局访问点。

设计模式是软件设计中出现的常见问题的可重用解决方案。它们是用于解决设计问题的模板,这些设计问题已被证明在各种情况下都是有效的。它们为开发人员提供了通用词汇和对最佳实践的共同理解,使他们更容易就复杂的设计问题进行沟通和协作。

总而言之,它们很重要,因为它们:

为常见设计问题提供经过验证的解决方案 促进开发人员之间的共同词汇和共识 节省创建解决方案的时间和精力 推广模块化和可维护的代码库 适用于各种设计问题,不受平台或语言限制。

设计模式并不特定于任何编程语言或技术。它们适用于任何软件开发项目,无论使用何种平台或语言。

单例模式

单一实例模式是一种设计模式,它将类限制为只有一个实例,同时提供对此实例的全局访问点。当只需要一个类的单个实例来控制整个执行过程中的操作时,将使用此模式。当您需要确保只创建类的一个实例并且可以从应用程序中的单个点访问该实例时,它特别有用。

Singleton 模式最常见的示例之一是 Logger 类。Logger 类用于将日志消息写入文件、数据库或其他存储介质。由于 Logger 类的多个实例将导致多个日志,因此将 Logger 类实现为 Singleton 是有意义的。

另一个示例是数据库连接管理器类,该类可确保在整个应用程序中仅创建和使用数据库连接的一个实例。

若要在 C# 中实现单一实例模式,可以使用以下步骤:

声明私有构造函数:私有构造函数确保不能从类外部实例化类。 声明私有静态实例变量:此变量保存类的单个实例。 声明一个返回类实例的公共静态方法:如果类的实例不存在,则此方法创建该实例,如果该实例存在,则返回现有实例。

下面是 C# 中 Singleton 模式的示例:

public class Singleton  
{  
    private static Singleton instance;  
    private static readonly object padlock = new object();  
  
    private Singleton()  
    {  
    }  
  
    public static Singleton Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                lock (padlock)  
                {  
                    if (instance == null)  
                    {  
                        instance = new Singleton();  
                    }  
                }  
            }  
            return instance;  
        }  
    }  
}

在此示例中,该属性使用双重检查的锁定机制来确保只创建类的一个实例,即使在多线程环境中也是如此。

工厂模式

Factory 模式是一种创建设计模式,它提供了用于在超类中创建对象的接口,但允许子类更改将要创建的对象的类型。Factory 模式提供了一种封装对象创建并将其委托给子类的方法。

工厂模式的一个常见示例是形状工厂,它根据用户的输入创建不同类型的形状。例如,可以要求工厂创建一个圆形、正方形或三角形,它将返回相应的形状对象。

另一个例子是 GUI 小部件工厂,它根据用户的请求创建不同类型的小部件(按钮、复选框等)。

若要在 C# 中实现工厂模式,可以使用以下步骤:

定义一个接口,该接口概述了要创建的对象的基本结构。 创建实现接口的具体类,并表示可以创建的不同类型的对象。 创建一个具有用于创建对象的方法的工厂类。此方法接受确定要创建的对象类型的参数,并返回相应的对象。

下面是 C# 中工厂模式的示例:

public interface IShape  
{  
    void Draw();  
}  
  
public class Circle : IShape  
{  
    public void Draw()  
    {  
        Console.WriteLine("Drawing a Circle");  
    }  
}  
  
public class Square : IShape  
{  
    public void Draw()  
    {  
        Console.WriteLine("Drawing a Square");  
    }  
}  
  
public class ShapeFactory  
{  
    public static IShape GetShape(string shapeType)  
    {  
        if (shapeType == "Circle")  
        {  
            return new Circle();  
        }  
        else if (shapeType == "Square")  
        {  
            return new Square();  
        }  
        else  
        {  
            return null;  
        }  
    }  
}

在此示例中,该类提供了一种用于创建类型为 的对象的方法。该方法接受一个参数,该参数确定要创建的形状类型,并返回相应的对象。

装饰器模式

装饰器模式是一种结构设计模式,允许您在不更改其底层结构的情况下动态添加或扩展对象的行为。它为扩展对象的功能提供了一种灵活的替代方法。

Decorator 模式的一个常见示例是咖啡店,您可以在其中为基本咖啡添加不同的口味和配料。例如,您可以在普通咖啡中加入奶油、糖或糖浆,每次添加都会改变咖啡的风味。

另一个例子是汽车定制商店,您可以在其中为基本汽车模型添加不同的配件。例如,您可以添加天窗、导航系统或音响系统,每次添加都会修改汽车的特性和功能。

若要在 C# 中实现 Decorator 模式,可以使用以下步骤:

定义一个界面,该界面概述了要装饰的对象的基本结构。 创建实现接口并表示对象的不同组件的具体类。 创建具体的修饰器类,这些类通过添加其他行为或职责来扩展对象的功能。这些修饰器类应实现与它们修饰的对象相同的接口。

下面是 C# 中 Decorator 模式的示例:

public interface ICoffee  
{  
    double GetCost();  
    string GetIngredients();  
}  
  
public class BasicCoffee : ICoffee  
{  
    public double GetCost()  
    {  
        return 1.0;  
    }  
  
    public string GetIngredients()  
    {  
        return "Coffee";  
    }  
}  
  
public abstract class CoffeeDecorator : ICoffee  
{  
    protected ICoffee decoratedCoffee;  
  
    public CoffeeDecorator(ICoffee coffee)  
    {  
        decoratedCoffee = coffee;  
    }  
  
    public virtual double GetCost()  
    {  
        return decoratedCoffee.GetCost();  
    }  
  
    public virtual string GetIngredients()  
    {  
        return decoratedCoffee.GetIngredients();  
    }  
}  
  
public class CreamDecorator : CoffeeDecorator  
{  
    public CreamDecorator(ICoffee coffee) : base(coffee)  
    {  
    }  
  
    public override double GetCost()  
    {  
        return decoratedCoffee.GetCost() + 0.5;  
    }  
  
    public override string GetIngredients()  
    {  
        return decoratedCoffee.GetIngredients() + ", Cream";  
    }  
}  
  
public class SugarDecorator : CoffeeDecorator  
{  
    public SugarDecorator(ICoffee coffee) : base(coffee)  
    {  
    }  
  
    public override double GetCost()  
    {  
        return decoratedCoffee.GetCost() + 0.2;  
    }  
  
    public override string GetIngredients()  
    {  
        return decoratedCoffee.GetIngredients() + ", Sugar";  
    }  
}

观察者模式

观察者设计模式是一种行为模式,它允许对象(称为主体)在其状态发生变化时通知许多其他对象(称为观察者)。该模式对于创建多个对象依赖于另一个对象的状态的系统非常有用,并且需要在状态更改时收到通知。

在 C# 中,可以使用委托和事件来实现 Observer 模式。主题类定义一个事件,观察者类订阅该事件。当主题的状态发生更改时,它会引发事件,并且所有已注册的观察者类都会收到通知。

下面是 C# 中 Observer 模式的简单示例:

public class Subject  
{  
    public delegate void EventHandler(string message);  
    public event EventHandler Notify;  
  
    public void Change(string message)  
    {  
        Notify?.Invoke(message);  
    }  
}  
  
public class Observer  
{  
    private string name;  
  
    public Observer(string name, Subject subject)  
    {  
        this.name = name;  
        subject.Notify += Update;  
    }  
  
    public void Update(string message)  
    {  
        Console.WriteLine($"{name} received: {message}");  
    }  
}

在此示例中,Subject 类定义一个名为 Notify 的事件,该事件的类型为 EventHandler 委托。Observer 类在其构造函数中将字符串名称和 Subject 对象作为参数,并将 Update 方法注册为 Notify 事件的事件处理程序。当使用者引发 Notify 事件并输出收到的消息时,将调用 Update 方法。

Subject 类的 Change 方法用于更改主题的状态并引发 Notify 事件,通知所有已注册的观察者类。在 Change 方法中使用运算符,以确保仅在有订阅者时引发事件。

此示例演示如何使用 Observer 模式创建一个系统,在该系统中,可以通知多个对象另一个对象的状态更改,而不必紧密耦合这些对象。该模式提供了一种灵活且可维护的方式,通过允许多个观察者收到对单个主题的更改的通知,来实现对象之间的通信并促进代码重用。

适配器模式

适配器模式是一种结构模式,它允许一个对象适应另一个对象的接口。当两个对象具有不兼容的接口,但其中一个对象需要由另一个对象使用时,该模式很有用。

在 C# 中,可以通过创建一个适配器类来实现适配器模式,该类包装目标对象并公开兼容的接口。适配器类实现所需的接口,并将调用委托给目标对象。

下面是 C# 中适配器模式的简单示例:

public interface ITarget  
{  
    void Request();  
}  
  
public class Adaptee  
{  
    public void SpecificRequest()  
    {  
        Console.WriteLine("Specific Request");  
    }  
}  
  
public class Adapter : ITarget  
{  
    private Adaptee adaptee;  
  
    public Adapter(Adaptee adaptee)  
    {  
        this.adaptee = adaptee;  
    }  
  
    public void Request()  
    {  
        adaptee.SpecificRequest();  
    }  
}

在此示例中,ITarget 接口使用 Request 方法定义目标对象所需的接口。Adaptee 类使用 SpecificRequest 方法定义特定接口。Adapter 类实现 ITarget 接口,并将 Adaptee 对象作为其构造函数中的参数。Adapter 类的 Request 方法将调用委托给 Adaptee 类的 SpecificRequest 方法。

此示例演示如何使用 Adapter 模式为两个接口不兼容的对象创建兼容接口。该模式提供了一种灵活且可维护的方式,通过允许客户端通过适配器使用目标对象来使对象相互适应并促进代码重用。

立面模式

立面模式是一种结构设计模式,它为复杂系统提供了简化的接口。该模式用于隐藏系统的复杂性,并为客户端提供统一且易于使用的界面。

在 C# 中,可以通过创建一个 Facade 类来实现 Facade 模式,该类向复杂系统公开一个简化的接口。Facade 类封装了系统的复杂性,并向客户端公开了一个简单直观的界面。

下面是 C# 中 Facade 模式的简单示例:

public class SubSystemA  
{  
    public void MethodA()  
    {  
        Console.WriteLine("SubSystemA MethodA");  
    }  
}  
  
public class SubSystemB  
{  
    public void MethodB()  
    {  
        Console.WriteLine("SubSystemB MethodB");  
    }  
}  
  
public class Facade  
{  
    private SubSystemA subSystemA;  
    private SubSystemB subSystemB;  
  
    public Facade()  
    {  
        subSystemA = new SubSystemA();  
        subSystemB = new SubSystemB();  
    }  
  
    public void Method()  
    {  
        Console.WriteLine("Facade Method");  
        subSystemA.MethodA();  
        subSystemB.MethodB();  
    }  
}

在此示例中,SubSystemA 和 SubSystemB 类表示 Facade 类旨在简化的复杂系统。Facade 类负责处理系统的复杂性,并通过其 Method 为客户端提供统一和简化的接口。调用 Method 时,它将调用 SubSystemA 类的 MethodA 和 SubSystemB 类的 MethodB。

Facade 模式有助于简化客户端与复杂系统的交互,并减少客户端与系统之间的耦合。通过提供简化的界面,Facade 模式使客户端更容易与系统交互,并降低错误和维护问题的风险。

命令模式

命令模式是一种行为设计模式,它将请求转换为对象,允许客户端参数化和排队请求,并允许在不同时间对请求进行排队和执行。如果希望能够对对象执行操作,但希望将实际操作与将执行操作的对象分开,则命令模式非常有用。

考虑一个场景,您有一个电视遥控器,并且想要更改频道。命令模式允许您向电视发送命令以更改频道,而无需知道如何更改频道的具体实现。

在此示例中,命令接口是为所有命令设置标准的基础:

public interface ICommand  
{  
    void Execute();  
}

接下来,可以为希望能够执行的每个操作创建 Command 接口的具体实现:

public class ChangeChannelCommand : ICommand  
{  
    private readonly Television _television;  
    private readonly int _channel;  
  
    public ChangeChannelCommand(Television television, int channel)  
    {  
        _television = television;  
        _channel = channel;  
    }  
  
    public void Execute()  
    {  
        _television.ChangeChannel(_channel);  
    }  
}

最后,可以创建一个将执行以下命令的类:

public class RemoteControl  
{  
    private readonly ICommand _command;  
  
    public RemoteControl(ICommand command)  
    {  
        _command = command;  
    }  
  
    public void PressButton()  
    {  
        _command.Execute();  
    }  
}

使用命令模式,可以将要执行的操作与将执行操作的对象分开,从而实现更灵活的模块化设计。

抽象工厂模式

抽象工厂模式是一种创建设计模式,它提供了一个接口,用于创建相关或依赖对象的族,而无需指定其具体类。

抽象工厂可以被视为创建对象系列的蓝图。抽象工厂定义了一组用于创建对象的方法,但将实例化的实际具体类的选择权留给了具体工厂子类。

下面是 C# 中的一个示例,用于演示抽象工厂模式:

 public abstract AbstractVehicleFactory  
{  
 public abstract IBody CreateBody();  
 public abstract IChassis CreateChassis();  
 public abstract IWindows CreateWindows();  
}  
  
public class CarFactory : AbstractVehicleFactory  
{ public  override IBody CreateBody()  
 {  
  
 return new CarBody();  
  
  
 public override IChassis CreateChassis()  
 {  
 return new CarChassis();  
  
  
 public override IWindows CreateWindows()  
 {  
 return new CarWindows();  
  
}  
  
public class TruckFactory : AbstractVehicleFactory  
{ public  override IBody CreateBody()  
 {  
  
 return new TruckBody();  
  
  
 public override IChassis CreateChassis()  
 {  
 return new TruckChassis();  
  
  
 public override IWindows CreateWindows()  
 {  
 return new TruckWindows();  
  
}  
  
public interface IBody { }public interface IChassis { }public  interface IWindows { }public class CarBody : IBody { }  
  
  
  
  
public class CarChassis :   IChassis  { }  
public class CarWindows : IWindows { }public class TruckBody : IBody { }public class TruckChassis : IChassis { }  
  
  
  
public    class TruckWindows :   IWindows  { }

在上面的例子中,我们有两个混凝土工厂,和 ,它们实现了接口。这些工厂分别提供了创建与汽车和卡车相关的对象的方法。通过使用抽象工厂,我们可以创建一整套相关对象,例如车身、汽车底盘、车窗、卡车车身、卡车底盘和卡车车窗,而无需指定要实例化的确切类。

当我们需要创建一组属于同一系列且结构相似但实现细节不同的对象时,抽象工厂模式会很有用。通过使用抽象工厂,我们可以封装对象的创建,并使我们的代码更加灵活和可维护。

生成器模式

构建器设计模式是一种创建设计模式,它提供了一种以增量方式构建复杂对象的方法。Builder 模式背后的主要思想是将复杂对象的构造与其表示分开,允许相同的构造过程创建不同的表示。

在面向对象编程中,构建器是帮助创建其他对象(通常是复杂对象)的对象。它提供了用于创建对象的更高级别的接口,从而可以更轻松地创建具有多个变量、分阶段构建或由多个对象组成的对象。

下面是演示 C# 中 Builder 模式的简单示例:

public class Car  
{  
    public string Make { get; set; }  
    public string Model { get; set; }  
    public int Year { get; set; }  
    public string Color { get; set; }  
  
    public Car(string make, string model, int year, string color)  
    {  
        Make = make;  
        Model = model;  
        Year = year;  
        Color = color;  
    }  
  
    public override string ToString()  
    {  
        return $"Make: {Make}, Model: {Model}, Year: {Year}, Color: {Color}";  
    }  
}  
  
public class CarBuilder  
{  
    private string make;  
    private string model;  
    private int year;  
    private string color;  
  
    public CarBuilder SetMake(string make)  
    {  
        this.make = make;  
        return this;  
    }  
  
    public CarBuilder SetModel(string model)  
    {  
        this.model = model;  
        return this;  
    }  
  
    public CarBuilder SetYear(int year)  
    {  
        this.year = year;  
        return this;  
    }  
  
    public CarBuilder SetColor(string color)  
    {  
        this.color = color;  
        return this;  
    }  
  
    public Car Build()  
    {  
        return new Car(make, model, year, color);  
    }  
}

在此示例中,该类表示我们要生成的复杂对象。该类提供用于设置对象属性的方法。该方法使用类中的方法设置的属性创建最终对象。该类在每次方法调用后返回,允许方法链接,使生成对象的过程更加直观和可读。

通过这种方式,Builder 设计模式通过将构造过程与对象的最终表示分离,提供了一种创建复杂对象的灵活方法。

原型模式

原型模式是一种创建设计模式,允许您通过克隆现有对象来创建对象,而不是直接创建新实例。当创建大量类似对象既耗时又耗费资源时,则使用此模式。原型模式提供了一种创建类似对象的有效方法,而不必每次都经历对象创建的整个过程。

使用原型模式的主要好处之一是,它允许您创建新对象,而无需经历对象创建的整个过程。这减少了创建新对象所需的时间和资源,并可以更轻松地快速创建类似的对象。

原型模式可以使用浅克隆或深克隆机制来实现。浅层克隆会创建一个与原始对象具有相同属性的新对象,但不会克隆这些属性本身。另一方面,深度克隆会创建一个与原始对象具有相同属性的新对象,并且还会克隆属性本身。

public abstract class Prototype  
{  
    public int X { get; set; }  
    public int Y { get; set; }  
  
    public Prototype(int x, int y)  
    {  
        X = x;  
        Y = y;  
    }  
  
    public abstract Prototype Clone();  
}  
  
public class ConcretePrototype : Prototype  
{  
    public ConcretePrototype(int x, int y) : base(x, y) { }  
  
    public override Prototype Clone()  
    {  
        return (Prototype)this.MemberwiseClone();  
    }  
}

在上面的示例中,抽象 Prototype 类定义了 Clone() 方法,该方法用于克隆对象。ConcretePrototype 类实现 Clone() 方法,使用 MemberwiseClone 方法创建对象的浅克隆。

若要使用 Prototype 模式,首先要创建 ConcretePrototype 类的实例。然后,使用 Clone() 方法基于原始对象创建新对象。每次使用 Clone() 方法时,都会创建一个具有与原始对象相同属性的新对象。

1

站心网

设计模式是软件设计中出现的常见问题的可重用解决方案。它们是用于解决设计问题的模板,这些设计问题已被证..

为您推荐

EasyCaching:一款灵活高效的 .NET 缓存库

EasyCaching 项目简介EasyCaching 是一个开源的 .NET 缓存抽象库,由 DotNetCore 团队开发,旨在为 .NET 应用提供简单、统一、强大且可扩展的缓存解决方案。它支持内存缓存(In-Memory)、Redis、Memcached、LiteDB..

.NET 依赖注入如何一个接口注册两种实现

在.NET的依赖注入(Dependency Injection,DI)系统中,一个接口注册两种或多种实现是常见的需求,尤其是在需要根据不同场景或条件选择不同实现时。以下是一些实现方法:1. 使用 IEnumerable<T> 解析所有实现这是最..

.NET C# 过滤从富文本编辑器html里的Javascript脚本

富文本编辑器在允许用户输入丰富内容的同时,也带来了跨站脚本攻击(XSS)的风险。过滤提交的 HTML 中的 <script> 脚本是防止跨站脚本攻击(XSS)的关键步骤。在 .NET C# 服务端过滤 <script> 脚本主要有以下几种方..

ZLinq:.NET 高性能 LINQ 替代方案及其使用指南

在 .NET 开发中,LINQ(Language Integrated Query)为数据查询提供了简洁且强大的语法。然而,传统的 LINQ 在处理大量数据时可能会引发性能瓶颈,主要由于频繁的内存分配和对象创建。为解决这一问题,Cysharp 团队..

.NET使用AutoMapper简化对象映射

在.NET软件开发中,常常需要将一个对象的数据转换并映射到另一个对象上。​这种手动映射的过程既繁琐又容易出错,影响开发效率和代码可维护性。​为了解决这一问题,AutoMapper应运而生。​什么是 AutoMapper?AutoM..

.NET C# RESTful API交互Refit库使用教程

Refit 是一个 .NET C# 库,它简化了与 RESTful API 的交互。Refit 受到 Square 的 Retrofit 库的启发,它将 REST API 转换为实时接口,允许你以声明方式定义 REST API 调用。Refit 的特点1. 声明式 API 定义:Refit ..

.NET C# System.Text.Json进阶使用技巧

System.Text.Json 是 .NET 中用于处理 JSON 数据的强大库。除了基本用法外,它还提供了许多进阶技巧,可以帮助你更高效、更灵活地处理 JSON 数据。以下是一些 System.Text.Json 的进阶使用技巧:1. 自定义序列化和反..

.NET Core 使用ML.NET 机器学习分析预测股票走势

在 .NET Core 中,你可以利用 ML.NET 框架来构建机器学习模型,以预测股票价格走势。以下是一个基本的实现步骤:​1. 准备数据:​收集并整理股票的历史数据,包括日期、开盘价、最高价、最低价、收盘价和成交量等信..

.NET 日志库 Serilog 使用教程

1. Serilog 简介Serilog 是 .NET 生态中强大且灵活的日志库,支持结构化日志记录,并提供多种日志接收器(Sinks),可以将日志输出到控制台、文件、数据库等不同存储介质。Serilog 适用于控制台应用、ASP.NET Core ..

.NET C# 单元测试 mock File.Exists的返回值

在 .NET 单元测试中,使用 Moq 来模拟 File.Exists 方法的返回值,可以这样做:1. 使用 Mock<FileSystem>(推荐).NET 提供了 System.IO.Abstractions 库,你可以使用 Mock<IFileSystem> 来替代 File,这样更符合依..

.NET Core 适配 鸿蒙HarmonyOS 的最新进展

.NET Core适配鸿蒙HarmonyOS的最新进展:运行能力方面目前.Net完全具备可以在OpenHarmony系统上运行的能力。其中,NativeAOT方式是较为可行的一种,它编译出的原生so不依赖glibc,可与鸿蒙系统的libc兼容,能在鸿蒙..

VS创建.NET Core项目使用Docker方式部署到Linux服务器

在 Visual Studio(VS) 中,使用 Docker 方式部署 .NET Core 项目 到 Linux 服务器,可以简化环境管理并提高部署效率。以下是完整教程:1. 在 VS 创建 .NET Core 项目并启用 Docker新建 ASP.NET Core 项目打开 Visu..

.NET C#查询全球IP地址信息 IPTools库 使用教程

IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家、省份、城市)以及经纬度等数据。IPTools GitHub地址:https://github.com/stulzq/IPToolsIPTools.China..

2025年.NET 10 和 C# 13 新特性示例

.NET 10预计将于2025年11月正式发布,带来一系列性能优化、开发者效率提升和跨平台能力增强。尽管官方功能集仍在开发中,早期预览版与社区讨论已揭示了多项值得期待的改进。这些增强将基于.NET 9的基础,引入新语言..

.NET Core网站减少内存占用的方法

在.NET Core网站开发中,有效管理内存占用对于保证应用程序的性能和稳定性至关重要。以下是一些减少内存占用的关键策略,它们着重于代码优化、内存管理以及相关因素的综合考虑。代码层面的优化首先,编写高效的代码..

.NET平台QR二维码生成库Net.Codecrete.QrCodeGenerator使用教程

今天给大家介绍一个免费的二维码生成库 Net.Codecrete.QrCodeGenerator ,它非常简洁、易用,且可以生成符合二维码标准的二维码图像。Net.Codecrete.QrCodeGenerator是一个开源的二维码生成库,适用于.NET平台。它基..

.NET9 SDK 新版本引入了新的解决方案文件格式.slnx

微软发布了 .NET 9 SDK 的新版本, 在这个新版本中引入了新的解决方案文件格式 slnx 的支持, 现在可以从 dotnet cli 来创建和维护 slnx 了, 并且支持了从 sln 迁移到 slnx, 目前 VisualStudio 和 Rider 都已经支持了 ..

.NET10 C#13最新语法糖用法示例

.NET 10 与 C# 13 带来了更高效的语法和更灵活的类型支持,包括 params 集合扩展、新的 \e 转义序列、方法组的自然类型推断优化,以及 ref struct 允许实现接口等特性,进一步提升了开发体验和代码可读性。C# 13 引..

.NET C# Predicate泛型委托使用方法

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。 Predicate<T> 通常用于集合的筛选或搜索操作,比如在 List<T> 的 Fi..

.NET异步编程Task.Run最佳实践

在.NET开发中,Task.Run是一个非常方便的方法,用于将工作移到线程池以异步执行。然而,虽然它看似简单易用,但滥用Task.Run可能会导致一系列性能问题,如线程池耗尽、上下文切换开销过大等。本文将深入探讨Task.Run..

发表回复

返回顶部