C#-this关键字的功能之扩展方法
1. 简介
我们的方法都是与声明他的类的相关联(我们现在写的各个方法都是在类中定义,所以我们调用方法都是用该方法所属类的实体对象调用)。
在C#3.0中的扩展方法的特征,允许声明的方法与不是声明该方法的类相关联。
2. 简单实例
下面我们定义了一个Person类,这个类有三个字段,和相应的三个属性
同时有一个方法 IntroductGender()。
public class Person
{
public Person(string name, int age, string gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
string _name;
public string Name
{
set;
get;
}
private int _age;
public int Age
{
get ;
set ;
}
string _gender;
public string Gender
{
get;
set;
}
//介绍自己姓名和性别
public void IntroductGender()
{
Console.WriteLine($"我是{this.Name},我是一个{this.Gender}生");
}
}
现在我们可能会遇到一个问题,我们觉得这个类中的方法不够,我们希望这个类中还有一个方法介绍自己姓名和年龄IntroductAge()。
这时候其实有多种方式
我们可以直接在原有的Person类中进行修改,添加方法IntroductAge()
如果这个类是第三方类库中的类,我们无法修改这个类的定义,但是只要这个类不是密封(sealed)的,我们就可以用这个类派生一个子类,继承遵循着只增不减,我们就可以在子类中添加这个IntroductAge()。
但是很多时候我们无法修改这个Person()类,比如说这个类是第三方类库中的密封类。这时候就可以想到扩张方法。
见下面代码实例:
public sealed class Person
{
public Person(string name, int age, string gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
string _name;
public string Name
{
set;
get;
}
private int _age;
public int Age
{
get ;
set ;
}
string _gender;
public string Gender
{
get;
set;
}
//介绍自己姓名和性别
public void IntroductGender()
{
Console.WriteLine($"我是{this.Name},我是一个{this.Gender}生");
}
}
//定义一个类这个类是静态类,其中有一个静态方法IntroductAge(),这个方法就是我们想要关联到Person类的方法
//注意定义扩展方法的参数是"this Person p "
public static extendPerson
{
public static void IntroductAge(this Person p )
{
Console.WriteLine($"我是{p.Name},我的年龄是{p.Age}")
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person("小明",24,"男");
p.IntroductGender();
//注意这里就是直接使用Person对象p,直接调用IntroductAge(),虽然IntroductAge()并非声明在Person类中
p.IntroductAge();
Console.ReadKey();
}
}
代码运行结果:
我是小明,我是一个男生
我是小明,我的年龄是24
3. 细节说明
- 声明扩展方法的类必须是静态类。
- 扩展方法本身必须声明为static
- 扩展方法必须包含关键字
this作为他的第一个参数类型,并在后面跟着他所要扩展的类的名称
C#-this关键字的功能之扩展方法的更多相关文章
- C#3.0新增功能04 扩展方法
连载目录 [已更新最新开发文章,点击查看详细] 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型 ...
- ..net 3.5新特性之用this关键字为类添加扩展方法
具体用法如下: public static class ClassHelper { //用this 声明将要吧这个方法附加到Student对象 public static bool CheckName ...
- Unity中自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...
- C#3.0扩展方法学习篇
什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...
- C#高级功能(四)扩展方法和索引
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...
- 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)
先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法 在C#中对泛型的扩展,输入参数是泛型本身的内容,返回值则是bool.基于这一点, ...
- C# 通过this关键字来扩展方法
好处:不需要继承,对现有类型进行扩展 public static class ExtString { public static string myTest(this String str) { re ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
随机推荐
- 一个简单IP防刷工具类, x秒内最多允许y次单ip操作
IP防刷,也就是在短时间内有大量相同ip的请求,可能是恶意的,也可能是超出业务范围的.总之,我们需要杜绝短时间内大量请求的问题,怎么处理? 其实这个问题,真的是太常见和太简单了,但是真正来做的时候,可 ...
- SQL执行错误#1064---保留字错误
CREATE TABLE IF NOT EXISTS `change` ( `id` INT NOT NULL AUTO_INCREMENT, `creator` VARCHAR(45) NOT NU ...
- python获取当前路径
python获取当前执行命令的路径: #!/usr/bin/env python # -*# coding: utf-8 -*- import os print os.getcwd() python获 ...
- Javascript基本类型回顾
本文是学习和总结ECMAScript5.1规范形成的.是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正).主要是各类型的实例方法,不包含任务构造函数的方法 ...
- Educational Codeforces Round 48 (Rated for Div. 2)——A. Death Note ##
A. Death Note time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- Pandas 基础学习
加载数据 Fun:pandas.read_csv >>> import pandas >>> food_info = pandas.read_csv("f ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- SpringBoot基础系列-使用Profiles
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996884.html SpringBoot基础系列-使用Profile 概述 Profi ...
- iptables 指南
iptables 是 Linux 内核集成的防火墙系统, 几乎所有 Linux 发行版都会内置 iptables. iptables 对进出的 IP 数据报进行处理和过滤, 过滤规则(rule)存储在 ...
- Linux学习笔记之MySql的安装(CentOS)
一.移除mariadb 由于CentOS默认安装了mariadb,所以在安装MySql之前先移除mariadb,使用命令:yum remove mariadb-libs.x86_64,如下图所示: 二 ...