C#——扩展方法

扩展方法

定义

扩展方法(Extension Methods)是C#中一种特殊的静态方法,它定义在一个静态类中,但是可以像实例方法一样被调用,使得代码更加简洁、易读。

设计目的

是为了给已有的类型添加新的行为,而不需要修改这些类型的原始定义。

特点

扩展方法有以下特点:

  1. 它必须在一个静态类中定义。
  2. 它必须有至少一个参数。
  3. 第一个参数必须有this前缀,并且指定了要扩展的类型。
  4. 第一个参数不能有任何其他的修饰符(如out或ref)。

示例一:

下面是一个扩展方法的示例,这个方法会在string类型上添加一个新的扩展方法,实现将字符串转换为全部大写的功能:

定义扩展方法

public static class ExtensionMethods
{public static string ToUpperCase(this string str){return str.ToUpper();}
}

使用扩展方法

string original = "Hello, World!";
string upperCase = original.ToUpperCase();
Console.WriteLine(upperCase);  // 输出 "HELLO, WORLD!"
Console.WriteLine("aaaa".ToUpperCase()); 

实际上,编译后,扩展方法调用就会翻译成普通的静态方法调用了

Console.WriteLine(ExtensionMethods.ToUpperCase("aaaa")); 

示例二:

需要一个扩展方法来帮助我们计算字符串中某个子串出现的次数,并且还可以指定是否忽略大小写。

定义扩展方法

using System;
using System.Collections.Generic;
using System.Linq;public static class StringExtensions
{// 扩展方法,用于计算字符串中子串出现的次数public static int CountOccurrences(this string source, string toFind, bool ignoreCase = false){if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(toFind))return 0;if (ignoreCase){source = source.ToLower();toFind = toFind.ToLower();}int count = 0;int start = 0;while ((start = source.IndexOf(toFind, start)) != -1){count++;start += toFind.Length;}return count;}
}

在这个例子中,CountOccurrences 方法的第一个参数 source 是带有 this 关键字的,表示这个方法将扩展 string 类型。接下来的两个参数分别是 toFind 字符串和一个布尔值 ignoreCase,用于指示是否忽略大小写进行匹配。

使用扩展方法

接下来,我们可以在程序中使用这个扩展方法:

class Program
{static void Main(){string text = "Hello world, hello everyone!";string pattern = "hello";// 计算不区分大小写的出现次数int countIgnoreCase = text.CountOccurrences(pattern, true);Console.WriteLine($"Pattern '{pattern}' occurs {countIgnoreCase} times (case-insensitive).");// 计算区分大小写的出现次数int countCaseSensitive = text.CountOccurrences(pattern, false);Console.WriteLine($"Pattern '{pattern}' occurs {countCaseSensitive} times (case-sensitive).");}
}

在这个示例中,我们创建了一个字符串 text 和一个子串 pattern,然后分别使用 CountOccurrences 方法来计算 pattern 在 text 中出现的次数,一次是忽略大小写的情况,一次是区分大小写的情况。

输出结果

当你运行这段代码时,应该会得到以下输出:

Pattern 'hello' occurs 2 times (case-insensitive).
Pattern 'hello' occurs 1 times (case-sensitive).

这个示例展示了如何定义一个带有多个参数的扩展方法,并且如何在实际应用中使用它。通过这种方式,你可以轻松地扩展现有类型的功能,同时保持代码的清晰和简洁。

注:接口也可以扩展

扩展方法链

定义

扩展方法链(Chaining Extension Methods)是指在一个表达式中连续使用多个扩展方法,从而使代码更加简洁和易读。这种方法在 C# 中非常常见,尤其是在处理集合和其他类型时。通过链式调用,你可以将多个操作串联在一起,形成流畅的代码风格。

示例

比如去除前后空白字符、转换为小写、替换某些字符等。我们可以定义一系列扩展方法,并将它们链式调用。

定义扩展方法

TrimAndToLower:去除前后空白字符并转换为小写。

ReplaceChars:替换字符串中的某些字符。

using System;public static class StringExtensions
{// 扩展方法:去除前后空白字符并转换为小写public static string TrimAndToLower(this string str){return str.Trim().ToLower();}// 扩展方法:替换字符串中的某些字符public static string ReplaceChars(this string str, char oldChar, char newChar){return str.Replace(oldChar, newChar);}
}

使用扩展方法

class Program
{static void Main(){string originalText = " Hello, World! ";// 链式调用扩展方法string processedText = originalText.TrimAndToLower() // 去除前后空白字符并转换为小写.ReplaceChars('!', '?'); // 替换 '!' 为 '?'Console.WriteLine("Original Text: " + originalText);Console.WriteLine("Processed Text: " + processedText);}
}

输出结果

Original Text:   Hello, World! 
Processed Text:  hello, world?

二义性与解析

命名空间

只有包含扩展方法的类在作用域内时(一般通过导入其所在的命名空间)我们才能够访问扩展方法。否则,编译时出错。

扩展方法与实例方法-优先级

任何兼容的实例方法的优先级总是高于扩展方法

示例

public static class ExtensionMethods
{public static string ToUpperCase(this string str){return str.ToUpper();}
}public  class Test
{public  string ToUpperCase(this string str){return str.ToUpper();}
}

上例中,如果使用ToUpperCase方法会调用Test的

上例中,只能通过普通的静态调用语法调用扩展方法:及ExtensionMethods.ToUpperCase(...)

扩展方法与扩展方法-优先级

如果两个扩展方法签名相同,则扩展方法必须作为一个普通的静态方法调用才能进行区分。(方法签名相同:方法名称和参数列表【参数的数量、类型及参数的顺序】相同;方法签名不包括方法的返回类型,也不包括参数的名称)

使用更具体的参数的方法优先级更高。

public static class ExtensionMethods
{public static string ToUpperCase(this string str){。。。。。}
}public static class Test
{public static string ToUpperCase(this object str){。。。。。}
}

下列代码将调用ExtensionMethods.ToUpperCase方法:

var a="aaaa".ToUpperCase();

注意:类型和结构体都比接口更加具体。

小白一枚~

大家一起学习~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模学习(124):使用Python实现模糊ARAS方法从原理到实战

文章目录 1. 引言2. 模糊ARAS方法原理2.1 模糊数的表示3. 案例分析:设备采购决策3.1 数据来源3.2 权重设定3.3 数据集3.4 Python实现模糊ARAS方法3.5 结果分析3.6 模糊ARAS的优势3.7 应用场景4. 总结参考文献1. 引言 在复杂的决策场景中,决策者往往面对的不仅仅是多个选择(…

Android APK打包脚本

build.gradle版本 同目录创建config.gradle文件写入需要的信息入 config.gradle文件内容 ext { /*** 自定义APP运行环境* dev: 开发* test: 测试* pro: 生产*/ env "pro" /*** 动态参数配置,根据自己需要添加参数* APP_ID: 包名* VERSION_CODE: 版本号…

【C++】奇异递归模板模式CRTP——静态多态

奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)是C模板编程时的一种惯用法(idiom):把派生类作为基类的模板参数。更一般地被称作F-bound polymorphism。CRTP在C中主要有两种用途&#xff1a…

在高质量视频生成文本、图像生成文本的GLM-4V-Plus技术加持下医疗未来的方向

人工智能的进步为医疗领域带来了巨大的变革,尤其是视频生成文字、图片生成文字和医学统计数据生成文字等技术的应用。这些技术使得我们能够更全面地利用大数据来辅助诊断,为患者提供更加精确和个性化的医疗服务。以下是一些可能的应用场景和优势&#xf…

国产网卡品牌崛起,做好网络信息安全的“守门人”

在信息技术日新月异的时代背景下,信息安全不仅关乎个人隐私保护,更是国家安全与经济发展的基石。LR-LINK联瑞凭借其前瞻性的视野和深厚的研发实力,成功自主研发出全国产化的FPGA(现场可编程门阵列)网闸隔离卡方案&…

优质企业上网行为管理软件大盘点

员工在上班时间摸鱼,看似是一个小问题,但却会给企业带来诸多不良影响。首先,摸鱼会降低员工的工作效率,导致工作任务无法按时完成,影响项目进度。其次,摸鱼行为会破坏企业的工作氛围,影响其他员…

零基础学习Python(七)

1. 字符串常用方法 lower()、upper():转换为小写字符串、大写字符串 split(str):按照指定字符串str进行分割,结果为列表: email "123qq.com" print(email.split("")) [123, qq.com] count(str)&#xf…

Linux 安装Mysql保姆级教程

一、检查环境 我们登录服务器,查看之前是否安装过mysql rpm -qa | grep mysql 由于我之前安装过,所以这里是有数据的 如果需要删除重新下载,可以使用 rpm -e mysql57-community-release-el7-10.noarch.rpm 二、安装 1、下载 接下来下载安装…

Hive SQL

一、基本数据类型 tinyint 1byte 有符号整数 smallint 2byte 有符号整数 int 4byte 有符号整数 bigint 8byte 有符号整数 boolean 布尔类型,true或者false float 单精度浮点数 double 双精度浮点数 decim…

电脑C盘临时文件怎么清理?

在解决“C盘临时文件怎么清理?”的问题前,先来一起了解一下清理C盘临时文件的原因: 释放磁盘空间:临时文件可以占用大量磁盘空间,尤其是在长时间未清理的情况下,清理这些文件可以释放空间。提高系统性能&a…

gaussian grouping训练自定义数据集

gaussian grouping是一个语义分割3DGS的方法。 它在每个3DGS点云中加入一个叫Identity Encoding的特征向量, 在渲染时把特征向量渲染到2D图像,每个像素位置为一个特征向量,使用额外的线性分类层对每个2D位置的特征向量分类。得到mask。 这个m…

Python——模块和包

模块 Python的模块(Modules)是Python程序的重要组成部分,它们允许你将代码分解成可重用的单元。每个模块都是一个包含Python代码的文件,文件名就是模块名加上.py后缀。模块可以定义函数、类和变量,也可以包含可执行的…

sheng的学习笔记-AI-半监督聚类

AI目录:sheng的学习笔记-AI目录-CSDN博客 半监督学习:sheng的学习笔记-AI-半监督学习-CSDN博客 聚类:sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 均值算法:sheng的学习笔记-AI-K均值算法_k均值算法怎么算迭代两次后的最大…

突发!Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情?

突发!2024年8月29日Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情? 🧐 今天我们来聊一聊科技圈一则爆炸性消息:Runway ML 从 HuggingFace 和 GitHub 上删库跑路,毫无预警!这个举动…

Java大文件上传方案(vue+饿了么):秒传、断点续传、分片上传!

前言 本篇文章是基于其他文章的基础上结合自己的理解写出来的,如果哪里有问题请指出! 详细教程 秒传 1、什么是秒传 通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有它就会进入秒传,想要不秒传&#xff0…

properties文件提示未引用

问题描述 以前用的好好的项目,今天突然打开就发现idea不识别spring配置信息显示未引用,如果config代码中引入的配置却可以高亮显示,然后输入spring相关的配置,文件是没有提示的。经过研究发现是spring相关的插件被关闭了。效果如下 解决方法 启用三个插件spring Boot,Sp…

看完这100道软件测试面试题,拿不到offer,算我输

掌握此套面试题,人手至少2份offer,绝不瞎吹!分享给大家。 一、自我介绍 二、灵活问题 1、大概说说之前公司的测试流程 2、测试报告有哪些内容? 3、如何保证用例的覆盖度? 4、什么是测试用例,什么是测试脚本&…

知识社区的小程序源码系统 界面支持万能DIY装修 带源代码包以及搭建部署教程

系统概述 知识社区的小程序源码系统是一款专为构建知识分享和交流社区而设计的强大工具。它提供了完整的源代码包,使开发者能够根据自己的需求进行定制和扩展,打造出个性化的小程序应用。 该系统的界面设计简洁大方,易于操作,同…

【JavaEE】线程安全性问题,线程不安全是怎么产生的,该如何应对

产生线程不安全的原因 在Java多线程编程中,线程不安全通常是由于多个线程同时访问共享资源而引发的竞争条件。以下是一些导致线程不安全的常见原因: 共享可变状态:当多个线程对共享的可变数据进行读写时,如果没有适当的同步机制&…

鸿蒙Next 单元测试框架——hypium

一 框架概述 单元测试框架(hypium)是HarmonyOS上的测试框架,提供测试用例编写、执行、结果显示能力,用于测试系统或应用接口。 表1 单元测试框架功能特性 二 安装使用 目前hypium以npm包的形式发布, 因此需要在Deveco Studio 工程级package.json内配…