C#中的扩展方法---Extension

C#中扩展方法是C# 3.0/.NET 3.x 新增特性,能够实现向现有类型中“添加”方法,以下主要介绍C#中扩展方法的声明及使用。

1、扩展方法的声明

扩展方法使能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。这里的“添加”之所以使用引号,是因为并没有真正地向指定类型添加方法。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

1).NET FrameWork中的扩展方法

VS中可以看扩展方法,如下图:

2)自定义扩展方法

定义扩展方法需要定义一个静态类,它的成员方法全是静态方法,而且每个方法的大部分第一参数都是以this开头。扩展方法的三个要素是:静态类、静态方法以及this关键字。

声明class类:

public class People
{public People(int id, string name, int age){this.Id = id;this.Name = name;this.Age = age;}public int Id{get;set;}public string Name{get;set;}public int Age{get;set;}
}

 声明扩展方法:

public static class PersonExtension
{public static string FormatOutput(this Person p){return string.Format("ID:{0},Name:{1},Age:{2}",p.ID, p.Name, p.Age);}
}

2、扩展方法的使用

对指定的类型声明扩展方法,可以通该类型的实例直接调用,

例如,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{class Program{static void Main(string[] args){Person p = new Person(5,"CJavaPY",1);Console.WriteLine(p.FormatOutput());   //可以直接调用扩展方法Console.ReadKey();}}public class Person{public Person(int id, string name, int age){this.ID = id;this.Name = name;this.Age = age;}public int ID{get;set;}public string Name{get;set;}public int Age{get;set;}}//声明扩展方法public static class PersonExtension{public static string FormatOutput(this Person p){return string.Format("ID:{0},Name:{1},Age:{2}",p.ID, p.Name, p.Age);}}
}

注意:如果要扩展的类中本来就有和扩展方法的名称一样的方法,编译器默认认为一个表达式是要使用一个实例方法,但如果没有找到,就会检查导入的命名空间和当前命名空间里所有的扩展方法,并匹配到适合的方法。

3、扩展方法的问题

使用扩展方法明显比使用传统方法要简单,不需要实例化,修改方法也不需要重新修改和编译,但也还是有一些问题:

1)扩展方法不能访问被扩展类的私有成员。

2)扩展方法会被扩展类的同名方法覆盖,所以实现扩展方法我们需要承担随时被覆盖的风险。

3)只有引入扩展方法坐在的命名空间后,扩展方法才可以使用。

4)扩展方法不具有override的能力,不会重载原有的方法。

注意:将实例方法调用在编译期改变为静态类中的静态方法调用,实际上扩展方法确实拥有静态方法所具有的所有功能。

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

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

相关文章

Flink在汽车行业的应用【面试加分系列】

很多同学问我为什么要发这些大数据前沿汇报? 一方面是自己学习完后觉得非常好,然后总结发出来方便大家阅读;另外一方面,看这些汇报对你的面试帮助会很大,特别是面试前可以看看即将面试公司在大数据前沿的发展动向&…

OmniFocus Pro for Mac(GTD时间管理软件) OmniFocus Mac版

OmniFocus Pro 3 for Mac 中文激活版是一款功能强大且灵活的 GTD 时间管理工具,可为您提供无干扰的环境,帮助您可以轻松地从邮件,消息,Safari 和任何其他第三方应用程序中安排任务,编写备注和剪辑信息。您可以快速轻松…

计算机网络:概述

0 学时安排及讨论题目 0.1讨论题目: CSMA/CD协议交换机基本原理ARP协议及其安全子网划分IP分片路由选择算法网络地址转换NATTCP连接建立和释放再论网络体系结构 0.2 本节主要内容 计算机网络在信息时代中的作用 互联网概述 互联网的组成 计算机网络在我国的发展 …

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打,yyds! 目录 一.欢迎来到我的酒馆二.键盘规格三.键盘分区 二.键盘规格 经常看视频,看到别人在键盘上一通干净利索的操作,就打出想要的文字。心里突然来一句:卧槽,打字贼快啊&#…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

解决php的使用大量elseif来判断请求的

$obj new p_cnt(); $methodName $_REQUEST[act]; $args [];if(!empty($methodName)) {// 使用call_user_func_array()调用方法$result call_user_func_array(array($obj, $methodName), $args); }class p_cnt {static function addContarctFunc(){echo <pre>;var_dump…

前端使用webscoket

前端 <template><div class"wrap"><button click"socketEmit">连接Socket</button><button click"socketSendmsg">发送数据</button></div> </template><script> export default {data(…

关于lumen严格模式接口mysql5.6和mysql5.7报错问题

sql语句 SELECT DISTINCTsomeid FROMsometable WHEREid IN ( 123, 456, 789 ) AND status 1 ORDER BYupdatetime DESC LIMIT 10 OFFSET 0环境配置 生产环境使用的是 MySQL 5.6&#xff0c;而开发环境使用的是 MySQL 5.7。 生产环境的 SQL Mode 是空&#xff0c;开发环境的…

acwing算法基础之数学知识--求一个数x的所有约数

目录 1 基础知识2 模板3 工程化 1 基础知识 使用试除法来求取一个数x的所有约数&#xff0c; void f(int x) {vector<int> res;for (int i 1; i < x / i; i) {if (x % i 0) {res.emplace_back(i);if (i ! n / i) res.emplace_back(n / i);}}//res即为数x的所有约数…

期中成绩这样发

数字化时代&#xff0c;成绩查询系统已经成为学校里不可或缺的一部分。老师们需要一种方便、快捷、准确的方式来发布和查询成绩&#xff0c;而学生们则需要一种安全、可靠的方式来获取自己的成绩。那么&#xff0c;如何实现这一目标呢&#xff1f;我来给大家介绍几种简单实用的…

uniapp发行web页面在老版本浏览器打开一片空白

uniapp发行的web页面&#xff08;菜单->发行->网站-PC Web或手机H5&#xff09;&#xff0c;对于一些老的浏览器&#xff08;或内核&#xff09;&#xff0c;打开一片空白&#xff1b; 而在新版本的浏览器中打开却正常。这是因为那些版本较低的浏览器不支持ES6的语法和新…

SpringBoot系列-2 自动装配

背景&#xff1a; Spring提供了IOC机制&#xff0c;基于此我们可以通过XML或者注解配置&#xff0c;将三方件注册到IOC中。问题是每个三方件都需要经过手动导入依赖、配置属性、注册IOC&#xff0c;比较繁琐。 基于"约定优于配置"原则的自动装配机制为该问题提供了一…

用excel计算矩阵的乘积

例如&#xff0c;我们要计算两个矩阵的乘积&#xff0c; 第一个矩阵是2*2的&#xff1a; 1234 第2个矩阵是2*3的&#xff1a; 5697810 在excel中鼠标点到其它空白的地方&#xff0c;用来存放矩阵相乘的结果&#xff1a; 选择插入-》函数&#xff1a; 选中MMULT&#xff0c;…

淘宝天猫京东苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)

淘宝天猫京东苏宁1688等平台关键词监控价格API接口&#xff08;店铺商品价格监控API接口调用展示&#xff09;代码对接如下&#xff1a; item_get-获得淘宝商品详情 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key&#xff08;必须以GET方式…

如何准确分析需求

业务驱动的需求思想 要做好软件需求工作&#xff0c;业务驱动需求思想是核心。传统的需求分析是站在技术视角展开的&#xff0c;关注的是“方案级需求”&#xff1b;而业务驱动的需求思想则是站在用户视角展开的&#xff0c;关注的是“问题级需求”。 变更/优化型需求分析任务…

头歌答案--爬虫实战

目录 urllib 爬虫 第1关&#xff1a;urllib基础 任务描述 第2关&#xff1a;urllib进阶 任务描述 requests 爬虫 第1关&#xff1a;requests 基础 任务描述 第2关&#xff1a;requests 进阶 任务描述 网页数据解析 第1关&#xff1a;XPath解析网页 任务描述 第…

通过 Elasticsearch 和 Go 使用混合搜索进行地鼠狩猎

作者&#xff1a;CARLY RICHMOND&#xff0c;LAURENT SAINT-FLIX 就像动物和编程语言一样&#xff0c;搜索也经历了不同实践的演变&#xff0c;很难在其中做出选择。 在本系列的最后一篇博客中&#xff0c;Carly Richmond 和 Laurent Saint-Flix 将关键字搜索和向量搜索结合起…

Hafnium之准虚拟化接口

安全之安全(security)博客目录导读 目录 一、HF_INTERRUPT_ENABLE 二、HF_INTERRUPT_GET 三、HF_INTERRUPT_DEACTIVATE 四、HF_INTERRUPT_RECONFIGURE Hafnium

基于Python实现,调用百度通用翻译API-详解

概述 在工作上需要各个国家语言的翻译方面很多地方用的上。 获取API权限: 登录百度账号,在个人信息界面,包括修改密码、绑定手机、身份人证等 https://api.fanyi.baidu.com/api/trans/product/desktop?req=developer 百度翻译开放平台 在开发者中心:需要开通个人账号…

redis之org.springframework.data.redis.RedisSystemException: Error in execution

背景 在运行某系统时&#xff0c;在测试类向redis中存入某值&#xff0c;然后取出。 一、遇到的问题 报错&#xff1a; org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: …