深入浅出 C# 扩展方法:为现有类型 “无痛” 扩展功能

C# 扩展方法 扩展方法是一种静态方法,但它看起来像是在扩展类型上的实例方法。扩展方法必须定义在一个静态类中。这是扩展方法的名称,遵循普通方法的命名规则。这是关键部分,通过使用this关键字和要扩展的类型,表明这个方法是对该类型的扩展。方法的参数列表,可以根据需要定义。set;set;return $"personName} }personAge} }C# 的扩展方法提供了一种强大的方式来扩展现有类型的功能,而无需修改原始类型的源代码。通过合理地使用扩展方法,可以使代码更加简洁、可读和可维护。 阅读详情

在 C# 编程中,我们常常会遇到这样的场景:想给string、int等系统内置类型,或是第三方库中的类添加新方法,但又无法修改这些类型的源代码。这时,扩展方法 就是解决这个问题的绝佳方案 —— 它能让你向现有类型 “添加” 方法,无需修改类型本身,也无需创建派生类或重新编译原有类型。

一、扩展方法的核心规则

扩展方法的使用有严格且明确的语法规则,缺一不可:
1. 容器类要求: 扩展方法必须定义在static(静态)类中,这个类相当于扩展方法的 “载体”;
2. 参数规则: 扩展方法的第一个参数必须是要扩展的类型,且参数前必须加this关键字,以此标记 “该方法是为这个类型扩展的”;
3. 命名空间要求: 使用扩展方法的代码文件,必须通过using指令引入扩展方法所在类的命名空间;
4. 本质特性: 扩展方法本质上是编译器的 “语法糖”,最终会被编译成普通静态方法的调用;
5. 访问限制: 由于底层是静态方法调用,扩展方法无法访问被扩展类型中private/protected等外部不可访问的成员。

二、扩展方法实战示例

下面通过一个 “判断字符串是否为邮箱格式(简化版)” 的案例,直观理解扩展方法的使用:

完整可运行代码

using System;

// 注意:若扩展方法类在不同命名空间,需在Program类所在文件添加using
namespace ExtensionMethodDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string email1 = "aaa@bb.com";
            string email2 = "bbb.cc";
            
            // 直接以“实例方法”的形式调用扩展方法
            Console.WriteLine($"{email1} 是否为邮箱:{email1.IsEmail()}"); // 输出 True
            Console.WriteLine($"{email2} 是否为邮箱:{email2.IsEmail()}"); // 输出 False
            Console.ReadKey();
        }
    }

    // 规则1:扩展方法所在类必须是static类
    public static class StringExt
    {
        // 规则2:第一个参数为被扩展类型,且加this关键字
        public static bool IsEmail(this string s)
        {
            // 简化版邮箱判断:仅检查是否包含@符号
            // 注意:无法访问string的私有成员,只能用公开方法/属性
            return !string.IsNullOrEmpty(s) && s.Contains("@");
        }
    }
}

代码说明

1. 容器类StringExt: 被声明为static,符合扩展方法的容器类要求;
2. 扩展方法IsEmail:

  • 第一个参数this string s:标记该方法是为string类型扩展的,s代表调用该方法的string实例;
  • 方法逻辑:通过string的公开方法IsNullOrEmpty和Contains判断是否包含 @符号,体现 “无法访问私有成员” 的特性;

3. 调用方式: 在Main方法中,email1.IsEmail()看似是调用string的实例方法,实则编译器会将其转换为StringExt.IsEmail(email1)(静态方法调用),这就是扩展方法的 “语法糖” 本质。

三、扩展方法的应用场景

1. 扩展系统内置类型: 如给string加校验方法、给int加数值判断方法,无需继承;
2. 扩展第三方库类型: 第三方库的类无法修改源码时,通过扩展方法补充功能;
3. 简化代码调用: 相比静态方法StringExt.IsEmail(email1),email1.IsEmail()的调用方式更符合面向对象的直觉,代码更简洁。

总结

  • 扩展方法的核心价值是无侵入式扩展现有类型的功能,无需修改原类型源码、无需继承;
  • 扩展方法的关键语法规则:静态容器类 + this标记第一个参数 + 引入命名空间;
  • 扩展方法本质是静态方法调用,无法访问被扩展类型的私有成员,仅能使用其公开成员。
扩展:Extensions.dll包含扩展现有C#类的扩展方法,从而使开发人员的工作更轻松 Extensions.dll包含可增强现有C#类的扩展方法,从而使开发人员的工作更加轻松。 扩展了以下类: - System.Array - System.Collections.Generic.Dictionary - System.DateTime - System.Diagnostics.Process - System.Double - System.Net.WebException - System.Object - System.String - System.Text.StringBuilder - System.TimeZoneInfo 使用这些方法: CompoundInterest() 给定金额(百分比),计算复利最终价值每年的利息和年数。 例如: doubleval = 100.00; val.CompoundInterest(5, 10, Cons 立即下载

相关推荐

C# Extension(扩展方法)

C# Extension(扩展方法),LinqExtensions、类型转换扩展、日期时间扩展、格式化扩展、验证扩展、可空类型

c#扩展方法

在 C# 中,扩展方法是一种特殊的静态方法,它可以为现有的类添加新的方法,而无需修改原始类的代码。这使得你可以在不继承该类或使用装饰器模式的情况下,为现有的类添加新的功能。希望这可以帮助你了解 C# 中的扩展方法。如果你有任何问题,请随时问我。的扩展方法,该方法用于计算字符串中的单词数。方法中,我们直接调用了这个扩展方法,而不是调用。

qq_41942413的博客 630

stata:stata软件教程(人大十八讲)(1) 第一章 stata入门

第一章 stata入门1.1 安装1.2 启用和退出1.3 打开和查看数据1.4 寻求帮助与网络资源1.5 命令示例1.6 几个环境设置1.7 复习与练习1.8 附录 注:教材为:Stata 统计分析教程 stata软件教程(人大十八讲) 中国人民大学出版社 陈传波 1.1 安装 1.2 启用和退出 1.3 打开和查看数据 1.4 寻求帮助与网络资源 1.5 命令示例 1.6 几个环境设置 1.7 复习与练习 1.8 附录 ...

qq_47805483的博客 1万+

C#扩展一个现有类

对一个现有的类进行方法的扩展 using System; namespace PureCSharpTest { public class Rubbish { public void Say() { Console.Write("Hello"); } } public static c...

gunjiu4462的博客 510

TP-LINK电信定制摄像头刷机教程:解锁官方功能与固件升级

固件是嵌入式设备的操作系统,控制着硬件的基础功能。其工作原理是通过更新或替换存储在设备非易失性存储器中的程序代码,从而改变设备的行为和功能。这项技术的核心价值在于赋予用户对设备的完全控制权,能够解除厂商或运营商的软件限制,实现功能自定义、性能优化和安全更新。在智能家居、网络设备和物联网领域,固件升级与刷机是常见的工程实践,用于修复漏洞、增加新特性或适配不同平台。本文聚焦于利用TFTP恢复模式这一通用网络设备维护机制,针对TP-LINK电信定制版摄像头,提供一套完整的刷机方案,将设备刷入官方通用版固件,以解除

weixin_34205826的博客 488

别再为H5扫码头疼了!用Vue3 + vue-qrcode-reader,5分钟搞定移动端摄像头调用(附完整代码)

本文详细介绍了如何使用Vue3和vue-qrcode-reader快速实现移动端扫码功能,解决H5开发中常见的摄像头调用和兼容性问题。通过完整的代码示例和优化技巧,帮助开发者高效集成二维码识别功能,提升用户体验和开发效率。

weixin_33737134的博客 513

C#中的扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释。假设一个控制台程序class Program{}里面的主函数如下: static void Main(string[] args) ...

weixin_33788244的博客 266

Dbeaver连接TDengine时序数据库

也没啥好总结的,就一句话:Dbeaver真香,而且还是我大JAVA实现的,赞。希望能帮到大家,uping。

zwrlj527的专栏 1900

C#之扩展方法

通常,我们想要向一个类型中添加方法,可以通过以下两种方式: 修改源代码。 在派生类中定义新的方法。 但是以上方法并不是万能的,我们并不能保证拥有一个类型的源码,也并不能保证这个类型可以让我们继承(如结构,枚举,String等等)。但是C#提供了一个办法,那就是扩展方法,使用扩展方法可以直接向现有的类型“添加”方法,无需修改类型的源码,也无需用一个派生类实现方法。 一、什么是扩展方法? 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 二、扩展方法结构

weixin_39520967的博客 1万+

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 324

本地 AI 自由!OpenClaw+Ollama 双系统部署教程(Windows/Linux),零成本离线跑大模型

本文详细介绍了如何在Windows和Linux双系统中部署OpenClaw AI助手,并通过Ollama对接本地大模型实现完全离线使用。教程包含环境准备、OpenClaw安装配置、Ollama本地模型部署、系统对接等完整流程,特别强调隐私安全和零Token消耗的优势。针对不同操作系统提供具体命令,并给出常见问题解决方案,即使是新手也能快速搭建专属本地AI助手。最终实现的方案无需联网、无使用成本,且能保障数据隐私安全。

2501_93651177的博客 7228

DotNetGuide扩展方法:为现有类型添加新功能

你是否曾因无法修改第三方库源码而无法为String、List等基础类型添加实用方法?是否在项目中重复编写格式化日期、验证数据的工具类?C#扩展方法(Extension Method)让你无需继承、无需修改原始类型,即可为任何类型注入新功能,完美解决"类型扩展困境"。本文将系统讲解扩展方法的实现原理、实战场景与性能优化,带你掌握这一提升代码优雅度的关键技术。 ## 一、扩展方法核心原理与语法规范 ...

gitblog_00898的博客 910

R 语言 ggplot2 绘制精美高级全球地图

在本教程中,我们将学习如何使用R语言和ggplot2包绘制精美高级地图。ggplot2是一个功能强大的数据可视化包,它可以让我们创建漂亮、交互式的地图。我们将使用R中的一些其他包来处理地理空间数据,以便与ggplot2无缝协作。

Mrrunsen的博客 1866

C#扩展方法

概念 扩展方法(Extension Methods)是C#3.0时引入的新特性,是一种特殊类型的静态方法。对于一个C#类型,如类、引用类型、值类型、接口等,扩展方法可以在不改变该类型源码的前提下,为它的实例提供新的成员。因此,若要为一个框架或第三方库的某个类型增加辅助功能,通过扩展方法就可以轻而易举的实现。 定义 声明扩展方法的类必须为static类; 扩展方法本身也必须声明为static; 扩...

sgmcumt的博客 7856

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

在 UG NX中,有时需要批量删除某文件夹下多个.prt文件中固定一些图层中的体对象和曲线对象,这时如果采用手动逐个打开模型,并选择针对的图层删除,即耗时也容易遗漏,因此采用外部模式来处理比较方便。本文介绍批量删除某些图层中的体对象和曲线对象。

GimiGimmy 3035

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# 为类型扩展方法

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

lffxgthmhfy的专栏 4131

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

探索 C# 扩展方法的强大功能

扩展方法提供了将其他方法合并到现有类型的能力,而无需创建新的派生类型、重新编译代码或对原始类型进行任何更改。这些方法本质上是静态的,但它们可以像属于扩展类型的实例方法一样被调用。当涉及到用 C#、F# 和 Visual Basic 编写的客户端代码时,调用扩展方法和利用类型中定义的方法之间没有明显的区别。扩展方法提供了一种解决方案,用于扩展类的功能,而无需访问源代码或授权将来修改该类。在引入扩展方法之前,通常使用继承来向现有类添加新成员,而无需通过创建子类并在其中定义新成员来更改原始类。

技术探索驿站 751

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# 扩展方法简介

C# 中提供一个非常实用的供能,扩展方法(Extension method),通过扩展方法,我们可以对已有类型做自己想做的相关扩展。 扩展方法是通过额外的静态方法扩展现有的类型。   扩展方法是在一个静态类中定义的,并且扩展方法也要是静态方法,并且扩展方法的第一个参数为要扩

Work Hard, Play Harder! 4180

windows C#-扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C#、F# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中定义的方法没有明显区别。最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable 类型。

王马的博客 703

c# 扩展方法详解

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this...

qq_33380252的博客 734

C#3.0扩展方法是给现有类型添加一个方法

C#3.0扩展方法是给现有类型添加一个方法。现在类型既可是基本数据类型(如int,string等),也可以是自己定义的类。//demo--1 //扩展基本类型 namespace testextensionmethods { // 必须建一个静态类,用来包含要添加的扩展方法 public static class extensions { //要添加

huihuijing的专栏 486

C# 扩展方法详解

在C#中,扩展方法是一种特殊的静态方法,可以像实例方法一样调用,但实际上是静态的。这些方法可以扩展现有类型的功能,而无需修改类型的定义。定义扩展方法的步骤静态类:扩展方法必须定义在一个静态类中。静态方法:扩展方法本身必须是静态的。this参数:扩展方法的第一个参数前加上this关键字,指定要扩展的类型。

tangPHP的博客 1228

技术图文:C# 语言中的扩展方法

背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下。 1.扩展方法概述 扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其它方式修改原始类型。 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collection.IEnumerable和Syste.Col...

老马的程序人生 1050

C#扩展方法详解:定义、实现与应用

概念:扩展方法使您能够向现有类型添加新的方法,而无需修改该类型的源代码或创建新的派生类型。这对于那些您无法控制其源代码的类型(如.NET框架中的类)特别有用。特性扩展方法被定义为静态方法,但可以通过实例方法语法进行调用。它们的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀。扩展方法不能访问被扩展类型的私有成员。

学习和分享 1310
上一篇: 深入解析 C# 中 abstract class 与 interface 的核心差异
下一篇: WPF 核心布局控件全解析:从 Grid 到 UniformGrid 的实战应用
bugcome_com
博客等级 码龄3年 32粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcome_com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值