shanzm-2019-02-03 00:35

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. 细节说明

  1. 声明扩展方法的类必须是静态类。
  2. 扩展方法本身必须声明为static
  3. 扩展方法必须包含关键字this 作为他的第一个参数类型,并在后面跟着他所要扩展的类的名称



C#-this关键字的功能之扩展方法的更多相关文章

  1. C#3.0新增功能04 扩展方法

    连载目录    [已更新最新开发文章,点击查看详细] 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型 ...

  2. ..net 3.5新特性之用this关键字为类添加扩展方法

    具体用法如下: public static class ClassHelper { //用this 声明将要吧这个方法附加到Student对象 public static bool CheckName ...

  3. Unity中自定义扩展方法

    问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...

  4. C#3.0扩展方法学习篇

     什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...

  5. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

  6. 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)

    先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...

  7. 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法

    扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法 在C#中对泛型的扩展,输入参数是泛型本身的内容,返回值则是bool.基于这一点, ...

  8. C# 通过this关键字来扩展方法

    好处:不需要继承,对现有类型进行扩展 public static class ExtString { public static string myTest(this String str) { re ...

  9. C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...

随机推荐

  1. [Swift]LeetCode980. 不同路径 III | Unique Paths III

    On a 2-dimensional grid, there are 4 types of squares: 1 represents the starting square.  There is e ...

  2. Java中异常的处理以及自定义异常,抛出异常到方法调用栈底层

    package com.gezhi; /** * 创建一个自定义异常SpendMoneyException类 *  * @author square 凉 * */@SuppressWarnings(& ...

  3. [Abp 源码分析]一、Abp 框架启动流程分析

    Abp 不一定仅用于 Asp.Net Core 项目,他也可以在 Console 与 WinFrom 项目当中进行使用,所以关于启动流程可以分为两种,一种是 Asp.Net Core 项目的启动流程, ...

  4. 前端(各种demo)二:左侧导航栏的折叠和打开(不使用js)基础版和升级版

    1.给div设置定位. 复习一下—— css中position有五种属性: static:默认值,没有定位 absolute:绝对定位,相对于父级元素进行定位 relative:相对定位 fixed: ...

  5. .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现

    本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...

  6. nginx切割日志脚本

    nginx切割日志脚本 #!/bin/bash #cut nginx log #2018年9月26日14:26:44 #by jiajiezhao ########################## ...

  7. Docker折腾手记-安装

    安装 docker红的发紫,所以博主耳闻这么久,也要来折腾折腾了 研究不多,个人目前认为docker给我们带来了以下好处 开发机器因为开发原因,需要配置各种各校的环境,繁琐且耗费资源.配来配去还容易环 ...

  8. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上一篇我介绍了JWT的生成验证及流程内容,相信大家也对JWT非常熟悉了,今天将从一个小众的需求出发,介绍如何强制令牌过期的思路和实现过程. ...

  9. DSAPI 获取实时统计信息CPU/内存/硬盘/网络

    有时,我们需要获取当前计算机中CPU.内存.硬盘.网络等实时信息,如下图:\ 要实现上述几项信息的获取,通常需要使用Timer控件来间隔获取,以便刷新最新的数据. 本示例中,放一个Timer控件,放一 ...

  10. .NetCore教程之 EFCore连接Mysql DBFirst模式

    一:创建EF的类库,同时将此项目设置为启动项(为Scaffold-DbContext -tables指令使用),同时安装2个包   ①Microsoft.EntityFrameworkCore.Too ...