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.hqwc.cn/news/168846.html

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

相关文章

xlua游戏热更新(C#访问lua)

xlua作为Unity资源热更新的重要解决方案api,在Tecent重多游戏中被采用,本文通过案例去讲解xlua代码结构层次。 /** Tencent is pleased to support the open source community by making xLua available.* Copyright (C) 2016 THL A29 Limited, a Tence…

快速走进通信世界 --- 基础知识扫盲

想不到吧,家人们,博主好久没来更新文章了,而且这次更新的是关于通信工程的文章。博主确实以前一直更新关于编程的文章,只不过最近在学习一些新的知识,以后有机会了我还是会继续更新一些编程技术文章的。不过每一门技术…

基于单片机设计的智能风扇(红外线无线控制开关调速定时)

一、项目介绍 在炎热的夏季,风扇成为人们室内生活中必不可少的电器产品。然而,传统的风扇控制方式存在一些不便之处,比如需要手动操作开关、无法远程控制和调速,以及缺乏定时功能等。为了解决这些问题,设计了一款基于…

如何用java写一个网站:从零搭建个性化网站

随着互联网的迅猛发展,Java作为一种强大而灵活的编程语言,为构建各类网站提供了丰富的解决方案。本文将探讨如何使用Java编写一个个性化网站,并通过具体实例进行深入分析。 第一步:选择适当的技术栈 在着手构建网站之前&#xff0…

【代码随想录】算法训练计划18

1、513. 找树左下角的值 题目: 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路: 递归,规则,基本可以自己写出来 var maxDepth int var res int fun…

深度学习之基于Django+Tensorflow商品识别管理系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 项目简介 本系统是一个基于DjangoTensorflow的商品识别管理系统。通过深度学习技术,实现商品的自动识别…

Linux系统编程——文件的打开及创建

打开(open) 使用open函数需要包含以下三个头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> open的函数定义格式 int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode…

CKA认证模块②-K8S企业运维和落地实战

CKA认证模块②-K8S企业运维和落地实战 Pod高级实战-Pod生命周期-启动钩子,停止钩子 Pod生命周期完整流程介绍 容器钩子; 容器探测; Pod重启策略; Pod的终止过程; Init容器; 初始化容器最佳实践 初始化容器与主容器区别是? init容器没有readinessProbe… [rootk8s-mast…

【机器学习】七、降维与度量学习

1. 维数灾难 样本的特征数称为维数&#xff08;dimensionality&#xff09;&#xff0c;当维数非常大时&#xff0c;也就是现在所说的维数灾难。 维数灾难具体表现在&#xff1a;在高维情形下&#xff0c;数据样本将变得十分稀疏&#xff0c;因为此时要满足训练样本为“密采样…

Postgres主键自增时重复键违反唯一约束

错误: 重复键违反唯一约束\"bue_new_copy1_pkey\"\n 详细&#xff1a;键值\"(id)(31)\"已经存在\n 新增的数据的id跟表里面的数据id重复了&#xff0c;这种一般是手动导入数据或者复制表等情况造成的&#xff0c;直接修改表的序列为当前最大的id&#xf…

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历

目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …

python实现全向轮EKF_SLAM

python实现全向轮EKF_SLAM 代码地址及效果运动预测观测修正参考算法 代码地址及效果 代码地址 运动预测 简化控制量 u t u_t ut​ 分别定义为 v x Δ t v_x \Delta t vx​Δt&#xff0c; v y Δ t v_y \Delta t vy​Δt&#xff0c;和 ω z Δ t \omega_z \Delta t ωz…