当前位置: 首页 > news >正文

C# 扩展方法

概念

C# 扩展方法允许在不修改原始类型源代码的情况下,为现有类型添加新的实例方法。扩展方法定义在一个静态类中,方法本身也是静态的,并且第一个参数使用 this 关键字修饰,指定要扩展的类型。

意义与作用

  • 增强代码的可读性和可维护性:可以把一些常用的、针对特定类型的操作封装成扩展方法,使代码在调用时更符合自然语言的表达习惯,方便理解和维护。
  • 提高代码复用性:针对一些常用类型(如 stringList<T> 等),可以编写通用的扩展方法,在多个项目或模块中复用。
  • 兼容第三方库:对于无法修改源代码的第三方库类型,通过扩展方法可以添加自定义功能 。

优势

  • 灵活性:不改变原始类型,却能扩展其功能,适应不同业务需求的变化。
  • 简洁性:调用方式如同类型自身的方法,简洁直观。

劣势

  • 命名冲突风险:如果不同的扩展方法库中对同一类型定义了同名扩展方法,可能会导致命名冲突和调用不明确。
  • 调试难度增加:由于扩展方法本质是静态方法的语法糖,调试时可能不如普通实例方法直观。

扩展方法本质

扩展方法是为现有类型添加新的实例方法(虽然本质是静态方法,但调用形式像实例方法 )。它是在不修改类型本身代码的前提下,扩充类型的行为能力。比如为 string 类型扩展判断是否为回文的方法,为 DateTime 类型扩展计算与当前时间间隔天数的方法等。

与属性扩展的区别

  • 作用对象:扩展方法作用于类型整体,是为类型添加新的操作行为。而属性扩展通常是指对属性的进一步修饰、增强,比如使用属性特性(Attribute)来约束、描述属性,或者在面向对象设计中通过继承、装饰器模式等对属性的访问、赋值逻辑等进行扩展,这和扩展方法概念不同。
  • 表现形式:扩展方法以方法形式存在,有输入参数、执行逻辑和返回值(如有必要 )。而属性相关操作主要围绕属性的读写,比如通过属性的 getset 访问器来实现。

代码案例

示例 1:为 string 类型扩展方法

csharp

// 定义扩展方法的静态类
public static class StringExtensions
{
    // 扩展方法:判断字符串是否为全大写
    public static bool IsAllUpperCase(this string str)
    {
        return str == str.ToUpper();
    }
}

class Program
{
    static void Main()
    {
        string test = "HELLO";
        bool result = test.IsAllUpperCase();
        Console.WriteLine(result); // 输出 True
    }
}
示例 2:为自定义类扩展方法

csharp

// 自定义类
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// 扩展方法类
public static class PersonExtensions
{
    // 为 Person 类扩展一个方法,打印个人信息
    public static void PrintInfo(this Person person)
    {
        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
    }
}

class Program
{
    static void Main()
    {
        Person p = new Person { Name = "Alice", Age = 30 };
        p.PrintInfo(); // 输出 Name: Alice, Age: 30
    }
}
http://www.dtcms.com/a/108356.html

相关文章:

  • 跨网连接vscode
  • 银联三级等保定级报告
  • CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
  • 闭环SOTA!北航DiffAD:基于扩散模型实现端到端自动驾驶「多任务闭环统一」
  • 面基spring如何处理循环依赖问题
  • conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境
  • 机器学习、深度学习和神经网络
  • vscode调试python(transformers库的llama为例)
  • C#实现HiveQL建表语句中特殊数据类型的包裹
  • 用docker部署goweb项目
  • RainbowDash 的 Robot
  • C++学习笔记(三十一)——map
  • Git的基础使用方法
  • 微信小程序唤起app
  • 【Docker】使用Docker快速部署n8n和unclecode/crawl4ai
  • PEFT实战(一)——LoRA
  • 大模型学习一:deepseek api 调用实战以及参数介绍
  • 【动手学深度学习】#7 现代卷积神经网络
  • C++多态:从青铜九鼎到虚函数表的千年演化密码
  • Pytorch|RNN-心脏病预测
  • 文件分享系统--使用AI Trae开发前后端
  • 鸿蒙应用元服务开发-Account Kit获取华为账号用户信息概述
  • 魔塔社区使用llamafactory微调AI阅卷试题系统
  • 应用弥散张量成像和支持向量机检测慢性爆炸相关轻度颅脑损伤
  • Dockerfile文件构建镜像Anaconda+Python教程
  • 六十天Linux从0到项目搭建(第十八十九天)(缓冲区机制、未打开的磁盘存放、文件存储、磁盘物理结构、寻址、块设备管理、文件系统、增删查改、硬链接、软链接)
  • 通俗易懂的解释Git操作中“合并”和“变基”的区别
  • CMD命令通过已知ip使用以下三种方式来获取对方主机名
  • 常见优化SQL语句策略和示例
  • ControlNet-Tile详解