PID 控制算法完整详解(C# 原生实现,无第三方库)

PID控制算法详解


基本概念

PID控制原理

PID(比例-积分-微分)控制器是工业控制系统中广泛采用的闭环反馈控制算法,由三个核心控制环节构成:

比例控制(P)
  • 输出与当前误差成正比
  • Kp系数越大,响应速度越快,但过大易引发振荡
积分控制(I)
  • 输出与误差积分成正比
  • Ki系数增强静差消除能力,但可能引起超调
微分控制(D)
  • 输出与误差变化率成正比
  • Kd系数有效抑制超调,但对噪声敏感

数学表达式:

其中:

  • u(t):控制器输出
  • e(t):误差信号

典型应用:温度控制、电机调速、液位调节、压力调控等工业自动化场景。

控制系统类型
开环控制系统

特征

  • 单向信号传输,无反馈机制
  • 控制精度依赖系统建模精度
  • 无法补偿外界干扰
  • 结构简单,成本低廉

应用实例

  • 定时洗衣机:固定洗涤时长
  • 普通电风扇:恒定风速输出
  • 基本加热器:持续功率工作
闭环控制系统

特征

  • 具备实时反馈回路
  • 通过设定值与实际值比较生成误差信号
  • 动态调整输出以修正偏差
  • 抗干扰能力强,控制精度高
  • 需配置传感器等反馈元件

应用实例

  • 智能空调:实时调节压缩机状态
  • 定速巡航:动态控制油门开度
  • 无人机:基于陀螺数据调整电机

误差分析

定义

误差e(t) = 设定值r(t) - 实际输出y(t)

误差分类

  • 瞬时误差:特定时刻偏差
  • 累积误差:时间积分值
  • 变化率:动态特性指标

处理方法

  • 比例项:当前误差
  • 积分项:历史累积
  • 微分项:趋势预测

注意事项

实际应用中需对误差信号进行滤波(如移动平均、低通滤波等),特别对微分项需抑制高频噪声放大效应。

历史背景


19世纪末,工业革命的推进促使调速器首次应用于蒸汽发动机,采用原始的比例控制(P控制)。尽管这种控制方式简单,但人们很快发现其固有缺陷:仅依靠比例控制必然会产生稳态静差(steady-state error),即系统输出无法完全达到设定值。这一现象在需要高精度控制的工业生产中尤为突出,例如蒸汽机转速调节常出现5%-10%的偏差。

1922年,俄国工程师Nicolas Minorsky在美国海军舰艇转向系统的研究中取得重大突破。他首次正式提出比例-积分(PI)控制的概念,通过引入积分项(I项)来累积误差信号,成功消除了稳态静差。Minorsky在论文《Directional stability of automatically steered bodies》中详细阐述了这一理论,并将其成功应用于USS New Mexico军舰的自动操舵系统。

1930年前后,控制理论进一步发展。工程师们发现,仅依赖PI控制仍存在超调量大、响应速度慢的问题。为解决这些不足,微分控制(D项)被引入,从而形成了完整的PID(比例-积分-微分)控制器架构。微分项的加入能够预测误差变化趋势,显著提升了系统的动态响应性能。

在实现技术上,早期的PID控制器主要采用气动或液压等模拟方式(连续模拟控制器)。这类模拟式PID依靠机械装置或流体力学原理实现控制算法,典型的应用包括1930年代的气动调节器(如Foxboro公司的产品)和1950年代的液压伺服系统。

20世纪70年代后,随着微处理器技术的突破性发展,数字离散PID逐渐取代模拟PID,这一转变具有里程碑意义:

  • 控制精度大幅提升(误差可控制在0.1%以下)
  • 参数调整更加灵活(可通过软件实时修改)
  • 具备数据记录和通信功能

现代数字PID已广泛应用于以下领域:

  • 工业自动化:PLC控制系统(如西门子S7系列)
  • 嵌入式系统:STM32等单片机实现
  • 过程控制:DCS工控上位机系统(如霍尼韦尔Experion)
  • 智能设备:工业机器人关节控制(如ABB机器人)
  • 温度控制:恒温箱、HVAC系统
  • 运动控制:伺服电机调速(如安川伺服驱动器)

数字PID的实现形式也从最初的定点运算发展到如今的浮点运算、自适应PID、模糊PID等高级变种,持续推动着控制技术的进步。

PID控制算法详解


连续时域模拟PID公式

连续时域下的标准PID控制算法公式为:

该公式可展开为三项独立作用的线性组合:

参数对应关系如下:

  • 积分系数:
  • 微分系数:
三项独立作用详解
P项(比例控制)

数学表达式:

工作原理

  • 直接根据当前误差值产生控制输出
  • 误差越大,控制器输出调节力度越强
  • 示例:温度控制系统设定100℃,当前90℃时,P项产生与10℃偏差成正比的加热功率

特性分析

  • 优点:响应迅速,能快速减小系统偏差
  • 缺点:单独使用存在稳态误差(静差)
  • 参数影响:增大可加快响应,但过高会导致超调和振荡
I项(积分控制)

数学表达式:

工作原理

  • 累积系统运行过程中的历史误差总和
  • 主要消除比例控制无法消除的稳态误差
  • 示例:消除电机转速因负载变化产生的偏差

特性分析

  • 优点:理论上可完全消除稳态误差
  • 缺点:
    • 易出现"积分饱和"现象
    • 系统响应初期可能造成大幅超调
    • 突发干扰下可能产生过大调节输出
D项(微分控制)

数学表达式:

工作原理

  • 反映误差信号变化速率(误差一阶导数)
  • 具有"预见性",能预判误差变化趋势
  • 示例:无人机姿态控制中预测偏差趋势并提前修正

特性分析

  • 优点:有效抑制系统振荡,提高稳定性
  • 缺点:
    • 对高频噪声敏感
    • 实际应用需配合低通滤波器
    • 传感器噪声会被放大导致输出抖动

数字离散化处理

计算机控制系统需将连续PID方程离散化:

  • 积分运算:采用矩形法数值积分近似
  • 微分运算:采用一阶差分近似
  • 采样周期:T(两次计算间隔时间,单位秒)

离散化关键考虑

  • 采样频率选择(通常取系统带宽5-10倍)
  • 数值积分方法精度(矩形法、梯形法等)
  • 差分运算的抗噪处理

离散PID的两种实现形式

位置式PID

输出为绝对控制量,适用于:

  • PWM占空比控制(0~100%)
  • 阀门开度控制(0~1000单位)
  • 伺服电机位置控制

数学表达式:

实现特点

  • 需存储所有历史误差值用于积分计算
  • 输出直接对应执行机构绝对位置/量值

主要缺陷

  • 积分项需要大量存储空间
  • 系统启动或设定值突变易导致积分饱和
  • 执行机构卡死会造成误差持续累积
  • 计算机复位可能导致控制量跳变
增量式PID(工程首选)

输出为控制量增量Δu,最终输出=上一次输出+增量

基本形式:

系数关系:

工程优势

  • 无需保存完整误差积分历史
  • 避免严重积分饱和问题
  • 误动作影响范围小,安全性高
  • 执行机构故障不会导致持续误差累积
  • 更易实现手动/自动无扰动切换

典型应用场景

  • 工业电机转速控制
  • 温度控制系统
  • 过程控制中的流量/压力调节
  • 机器人关节位置控制

实现注意事项

  • 需合理设置输出限幅
  • 建议加入抗积分饱和措施
  • 慢变化过程可适当降低采样频率
  • 高频噪声环境下需配置数字滤波器

PID 控制循环执行流程详解


基本执行步骤

获取设定值 (Setpoint)
  • 定义:系统期望达到的目标值
  • 类型:
    • 恒定值(如恒温控制系统中的25℃)
    • 动态变化值(如运动轨迹跟踪)
读取过程变量 (ProcessValue)
  • 采集方式:
    • ADC转换
    • 通信接口读取
  • 注意事项:
    • 需进行噪声处理(如滤波)
    • 采样方式可选择定时中断或事件触发
误差计算
  • 计算公式:
  • 误差方向:
    • 正值:当前值低于目标
    • 负值:当前值高于目标
  • 可选处理:
    • 归一化误差
    • 带死区计算
PID计算(分模式处理)
  • 位置式PID

  • 增量式PID

  • 模式选择建议:

    • 位置式:适用于无记忆执行器
    • 增量式:可避免积分饱和
输出限幅(关键保护)
  • 限制类型:
    • 硬限制:基于执行器物理特性(如0-100% PWM)
    • 软限制:系统安全范围(如不超过额定转速120%)
  • 抗积分饱和:输出限幅时冻结积分项
状态更新
  • 更新误差队列:
  • 积分项维护:注意积分分离和抗饱和处理
  • 增量式PID需保存上次输出值
输出执行
  • 执行方式:
    • PWM输出
    • 模拟电压
    • 通信指令
  • 示例:通过4-20mA信号控制阀门开度
  • 注意事项:考虑执行器响应延迟
定时等待
  • 采样周期选择:系统响应时间的1/5~1/10
  • 实现方式:
    • 硬件定时器中断
    • RTOS任务延时
  • 重要提示:保持采样周期稳定

增强型流程图

graph TD A[初始化] --> B[参数加载] B --> C[定时中断/任务触发] C --> D[传感器数据采集与预处理] D --> E[误差计算与方向判断] E --> F[PID模式选择与运算] F --> G[输出限幅与保护处理] G --> H[执行机构驱动] H --> I[状态变量更新] I --> J[采样周期等待] J --> C

典型应用场景

温度控制系统
  • 采样周期:1-10秒
  • 特殊处理:加强微分作用应对大惯性
电机转速控制
  • 采样周期:1-10ms
  • 关键点:高频噪声抑制
无人机姿态控制
  • 多回路结构:外环位置PID + 内环角速率PID
  • 采样周期:<5ms

注意事项

  • 首次运行需进行参数整定(手动/自动)
  • 长期运行建议实现自适应调整
  • 关键系统应配备:
    • 看门狗机制
    • 故障保护功能

算法性能分析与PID参数整定指南


控制系统性能评价指标详解

上升时间 (Rise Time)

上升时间是指系统响应从稳态值的10%上升到90%所需的时间。它是衡量系统响应速度的重要指标:

  • 在工业机器人控制中,较短的上升时间意味着更快的动作响应
  • 典型场景:数控机床的伺服系统通常追求毫秒级的上升时间
超调量 (Overshoot)

超调量是指系统响应超过稳态值的最大百分比:

  • 在化工过程中,过大的超调可能导致反应釜压力超过安全限值
  • 电梯控制系统通常将超调量控制在5%以内以保证乘坐舒适性
调节时间 (Settling Time)

调节时间是指系统响应进入并保持在稳态值±2%或±5%范围内所需的时间:

  • 发电厂频率调节系统通常要求调节时间在秒级
  • 精密仪器定位系统可能需要微秒级的调节时间
稳态误差 (Steady-state Error)

稳态误差是系统响应达到稳定状态后与期望值的偏差:

  • 在温控系统中,1℃的稳态误差可能影响产品质量
  • 卫星姿态控制系统对稳态误差要求极高,通常需小于0.1度

PID参数影响机制深度解析

比例系数Kp的影响
  • 上升时间↓:Kp增大使系统对误差的即时响应增强,如工业烤箱温度控制中,Kp从1增加到3可使升温时间缩短40%
  • 超调↑:过大的Kp会导致"矫枉过正",如无人机高度控制中Kp过大可能引起明显的上下振荡
  • 稳态误差↓:但无法完全消除,在液位控制系统中,仅用P控制通常会有5-10%的残余误差
积分系数Ki的影响
  • 消除稳态误差:在太阳能跟踪系统中,Ki可消除因云层遮挡导致的累积位置偏差
  • 副作用明显:某水处理pH控制案例显示,Ki增加50%导致超调量从15%增至35%
微分系数Kd的影响
  • 抑制超调:在3D打印机喷头温度控制中,适当Kd可将超调从20%降至5%
  • 噪声敏感性:某实验室压力控制系统测试显示,Kd超过临界值后,传感器噪声被放大3倍

PID参数整定实践指南

分步整定方法论
纯比例阶段调试
  • 案例:某注塑机温度控制系统
  • 初始设定:
  • 逐步增加Kp至2.8时出现周期性小幅波动(±1.5℃)
  • 确定临界增益,振荡周期
引入积分作用
  • 采用Ziegler-Nichols经验公式:
  • 实际调试中从0.005开始,每次增加0.001
  • 时稳态误差从3℃降至0.5℃
加入微分调节
  • 初始
  • 实际采用保守策略,从30开始逐步增加
  • 最终时,超调从25%降至8%,调节时间缩短30%

系统特性适配策略

大惯性系统(如工业窑炉)

  • 典型特征:热容大,响应慢(时间常数>10分钟)
  • 参数特点:Kd取值较小(通常<20),Ki需谨慎调节
  • 安全策略:采用抗积分饱和算法,限制积分项累积

快速响应系统(如气压控制)

  • 典型特征:响应快(时间常数<1秒),易受干扰
  • 参数特点:可适当增大(比例可达的1/5)
  • 实现技巧:配合低通滤波器使用,截止频率设为系统带宽的5-10倍

特殊注意事项

  • 对于存在显著传输延迟的系统,建议采用Smith预估器等先进控制策略
  • 在电机控制等高频系统中,需考虑数字实现的采样周期影响(通常要求采样频率>10倍系统带宽)

原生完整代码


包含:基础位置式 PID、增量式 PID、积分分离抗积分饱和改进 PID、仿真测试入口;控制台直接运行。

cs 复制代码
using System;
using System.Threading;

namespace PidAlgorithmDemo
{
    /// <summary>
    /// 标准位置式PID控制器 + 积分分离+抗积分饱和改进
    /// </summary>
    public class PositionPid
    {
        #region PID参数
        //比例系数
        public double Kp { get; set; }
        //积分系数
        public double Ki { get; set; }
        //微分系数
        public double Kd { get; set; }

        //采样周期 单位s
        public double SampleTime { get; set; }

        //输出上下限(执行机构限制)
        public double OutputMin { get; set; }
        public double OutputMax { get; set; }

        //积分分离阈值:误差大于该值关闭积分,防止饱和
        public double IntegralSeparateThreshold { get; set; }
        #endregion

        #region 内部状态变量
        //误差累加(积分项)
        private double _integralSum;
        //上一次误差
        private double _lastError;
        #endregion

        /// <summary>
        /// 构造函数初始化PID
        /// </summary>
        public PositionPid(double kp, double ki, double kd, double sampleTime, double outMin, double outMax, double integralThreshold)
        {
            Kp = kp;
            Ki = ki;
            Kd = kd;
            SampleTime = sampleTime;
            OutputMin = outMin;
            OutputMax = outMax;
            IntegralSeparateThreshold = integralThreshold;

            Reset();
        }

        /// <summary>
        /// PID计算核心方法
        /// </summary>
        /// <param name="setPoint">目标设定值</param>
        /// <param name="processVal">实际反馈值</param>
        /// <returns>PID输出控制量</returns>
        public double Calculate(double setPoint, double processVal)
        {
            double error = setPoint - processVal;

            //1.比例项
            double pOut = Kp * error;

            //2.积分项 + 积分分离
            double iOut = 0;
            if (Math.Abs(error) < IntegralSeparateThreshold)
            {
                _integralSum += error * SampleTime;
                //抗积分饱和:积分累加值限幅
                _integralSum = Math.Clamp(_integralSum, OutputMin / Ki, OutputMax / Ki);
                iOut = Ki * _integralSum;
            }

            //3.微分项
            double dOut = Kd * (error - _lastError) / SampleTime;

            //总输出
            double output = pOut + iOut + dOut;
            output = Math.Clamp(output, OutputMin, OutputMax);

            //更新历史状态
            _lastError = error;
            return output;
        }

        /// <summary>
        /// 重置PID内部状态(启停、切换目标时调用)
        /// </summary>
        public void Reset()
        {
            _integralSum = 0;
            _lastError = 0;
        }
    }

    /// <summary>
    /// 增量式PID控制器
    /// 输出控制增量,适合步进电机、阀门增量驱动场景
    /// </summary>
    public class IncrementPid
    {
        public double Kp { get; set; }
        public double Ki { get; set; }
        public double Kd { get; set; }
        public double SampleTime { get; set; }
        public double DeltaMin { get; set; }
        public double DeltaMax { get; set; }

        //历史误差 e(k),e(k-1),e(k-2)
        private double _ek;
        private double _ek1;
        private double _ek2;

        public IncrementPid(double kp, double ki, double kd, double sampleTime, double deltaMin, double deltaMax)
        {
            Kp = kp;
            Ki = ki;
            Kd = kd;
            SampleTime = sampleTime;
            DeltaMin = deltaMin;
            DeltaMax = deltaMax;
            Reset();
        }

        public double Calculate(double setPoint, double processVal)
        {
            _ek = setPoint - processVal;
            double a = Kp;
            double b = Kp * SampleTime / Ki;
            double c = Kp * Kd / SampleTime;

            double deltaU = a * (_ek - _ek1) + b * _ek + c * (_ek - 2 * _ek1 + _ek2);
            deltaU = Math.Clamp(deltaU, DeltaMin, DeltaMax);

            //更新误差缓存
            _ek2 = _ek1;
            _ek1 = _ek;
            return deltaU;
        }

        public void Reset()
        {
            _ek = 0;
            _ek1 = 0;
            _ek2 = 0;
        }
    }

    /// <summary>
    /// 简易一阶惯性仿真对象(模拟温控/水温大惯性系统,用于离线调试PID)
    /// G(s)=K/(Ts+1)
    /// </summary>
    public class SimulatePlant
    {
        private readonly double _gain;
        private readonly double _timeConst;
        private double _output;

        public SimulatePlant(double gain, double timeConstant)
        {
            _gain = gain;
            _timeConst = timeConstant;
            _output = 0;
        }

        public double Step(double input, double dt)
        {
            //离散近似一阶惯性环节
            _output += dt / _timeConst * (_gain * input - _output);
            return _output;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===== PID C# 仿真测试 位置式PID =====");
            //PID参数
            double kp = 2.2;
            double ki = 0.12;
            double kd = 0.25;
            double sampleTime = 0.1; //100ms采样周期
            var pid = new PositionPid(kp, ki, kd, sampleTime, 0, 100, 12);
            var plant = new SimulatePlant(gain:1.0, timeConstant:4.5);

            double target = 50; //目标值50
            double feedback = 0;
            int cycle = 0;

            while (cycle < 150)
            {
                double pidOut = pid.Calculate(target, feedback);
                feedback = plant.Step(pidOut, sampleTime);

                Console.WriteLine($"周期:{cycle} 设定值:{target:F2} 实际:{feedback:F2} PID输出:{pidOut:F2}");
                cycle++;
                Thread.Sleep(100);
            }

            Console.WriteLine("\r\n仿真结束,按任意键退出");
            Console.ReadKey();
        }
    }
}

代码说明

  • PositionPid:位置式 PID 内置积分分离 + 积分限幅,解决经典积分饱和超调问题,工程最常用;
  • IncrementPid:增量式 PID 输出增量,适合不允许输出突变的执行机构;
  • SimulatePlant 一阶惯性仿真模型,不需要硬件,直接在电脑上调试 PID 参数;
  • 全部使用.NET 原生 API,无 Nuget、无第三方控件 / 数学库,可移植到 WPF 上位机、.NET 嵌入式环境。

PID 控制器的优缺点分析


优点

结构简单,计算量小
  • 仅需进行简单的加减乘除运算,无需复杂数学运算
  • 可在低性能MCU(如STM32F103)上实现100Hz以上的高速运行
  • .NET平台下单次计算耗时通常小于1ms
  • 适合资源受限的嵌入式系统应用
参数物理意义清晰,调试经验成熟
  • 比例(P)项对应当前误差的即时响应
  • 积分(I)项消除稳态误差
  • 微分(D)项预测未来误差变化趋势
  • 业界有成熟的Ziegler-Nichols等整定方法
  • 数十年工业应用积累了大量调试经验
不依赖精确数学模型(无模型控制)
  • 无需事先建立被控对象的精确数学模型
  • 适用于机理复杂或难以建模的系统
  • 在液压系统、简单温控等场景表现良好
鲁棒性较强
  • 对中等程度的参数变化和外部扰动不敏感
  • 能在±15%参数变化范围内保持稳定
  • 适用于环境条件相对稳定的工业场景

缺点

线性算法的局限性
  • 仅适合线性或弱非线性系统
  • 在高度非线性系统(如机械臂、无人机姿态)控制效果差
  • 无法处理饱和、死区等非线性特性
微分项对噪声敏感
  • 微分作用会放大传感器的高频噪声
  • 需要额外增加低通滤波器(通常取τ=0.1-0.2*采样周期)
  • 在振动较大的机械系统中可能引起控制量抖动
大滞后系统控制效果不佳
  • 对长管道温度控制(滞后时间>5s)效果差
  • 传送带物料输送等延迟系统难以稳定
  • 需要结合Smith预估器等补偿算法
参数固定,缺乏自适应性
  • 参数整定基于特定工况
  • 当负载特性变化(如机械臂抓取不同重量物体)时需要重新整定
  • 无法自动适应环境参数变化(如季节变化导致的热交换特性改变)
纯反馈调节的局限性
  • 只能对已发生的误差进行修正
  • 面对突加负载等大幅度扰动响应迟缓
  • 无法像前馈控制那样预先补偿可测扰动
  • 在精密控制系统(如半导体制造)中常需结合前馈控制

适用场景


非常适合(经典 PID 控制表现优异的场景)

水温/烤箱温度控制
  • 细节说明:PID 通过实时调节加热功率(如 PWM 占空比)来稳定温度,适用于恒温箱、热水器、3D 打印热床等场景。
  • 示例:电烤箱在 200°C 设定下,PID 可快速抑制开门散热导致的温度波动。
直流电机速度闭环
  • 实现方式:通过编码器反馈转速,PID 动态调整 PWM 输出或电压,适用于机器人关节、传送带调速等。
  • 注意点:需根据电机惯性调整微分项,避免振荡。

液位控制

  • 典型应用:水箱液位维持,通过调节进水阀开度补偿出水流量变化,常见于化工和水利系统。

气压压力调节

  • 场景扩展:如空压机输出稳压、真空腔室压力控制,PID 通过调节阀门或泵速实现快速响应。

无人机姿态稳定

  • 控制逻辑:结合陀螺仪数据,PID 分别调节各电机推力以实现俯仰/横滚角稳定,需多回路协同。

流水线张力控制

  • 机制:通过张力传感器反馈,PID 实时调整收放卷辊速度,防止材料断裂或松弛,适用于纺织、薄膜生产。

PLC 常规运动控制

  • 举例:直线模组定位、伺服电机轨迹跟踪,PID 用于消除位置误差(比例项主导)。

⚠️ 不适合单独使用 PID 的场景

超大纯滞后系统

  • 问题根源:如长管道温度控制,反馈延迟超过调节周期,易导致超调振荡。
  • 改进方案 :搭配 史密斯预估器(提前预测滞后效应)。

强非线性系统

  • 典型场景:机械臂关节摩擦突变、液压系统死区,PID 参数难以全局适配。
  • 解决方案 :采用 模糊 PID(动态调整参数)或分段 PID。

快速剧烈扰动场景

  • 示例:无人机遭遇强风突袭、高频振动的精密平台。
  • 应对措施 :结合前馈控制或 自适应 PID(实时识别扰动并调整参数)。

总结:PID 是基础且广泛适用的算法,但在复杂场景中需与其他控制策略融合以提升鲁棒性。

总结


PID 是工业自动化控制的核心算法,其本质是通过对误差的历史数据、当前状态和变化趋势进行线性反馈调节。在工程应用中,模拟 PID 仅用于理论研究,实际均采用离散数字 PID;其中位置式算法更直观易懂,而增量式则具备更高的安全性。

基础 PID 存在积分饱和和对噪声敏感等局限性,实际工程中需采用改进策略(如积分分离、输出限幅、滤波微分等)进行优化。

本文采用 C# 实现完全原生且无依赖的 PID 控制,支持离线仿真调试,既可直接作为上位机控制代码使用,也可作为学习 PID 离散数字化的标准参考范例。

相关推荐
离陌在学C#1 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
小金子会发光5 小时前
C# WinForms 基于 Socket 手搓 Modbus TCP 调试助手(支持 01/02/03/04/05/06/0F/10)
c#·socket·plc·modbus tcp·工业通信
慧都小妮子6 小时前
PDF图片提取总“褪色“?Aspose.PDF 多层级提取能力详解
pdf·c#·.net·图片处理·文档处理·色彩空间
-银雾鸢尾-8 小时前
C#中的反射关键类-Type
开发语言·c#
淡海水10 小时前
15-07-YooAsset面试篇-Unity性能优化与内存管理
java·unity·面试·性能优化·c#·游戏引擎
离陌在学C#10 小时前
C# 多态:面向对象编程的核心特性详解
开发语言·c#
一念春风11 小时前
文件透明加密(C、C#)
c语言·c#·wpf
hez20101 天前
.NET 11 Runtime Async 详解
c#·.net·.net core
猿长大人1 天前
C# | Serilog 新手入门
开发语言·c#·.net·log