C#-this关键字的功能之扩展方法

扩展方法

简介

我们的方法都是与声明他的类的相关联(我们现在写的各个方法都是在类中定义,所以我们调用方法都是用该方法所属类的实体对象调用)。

在C#3.0中的扩展方法的特征,允许声明的方法不是声明该方法的类相关联。

简单实例

下面我们定义了一个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

细节说明

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

原文地址:https://www.cnblogs.com/shanzhiming/p/10349512.html

时间: 2024-08-04 04:09:43

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

基于Java的Jess功能函数扩展方法

Jess是Java expert system shell的缩写,是Java平台上的规则引擎,它是CLIPS程序设计语言的超集,是完全使用Java语言编写一种用于开发专家系统的语言.对于基于规则的推理,特别是针对逻辑条件的推理,Jess是已知规则引擎中最快的.它以增强型Rete算法为基础,支持前向推理,也支持后向推理,具有直接对Java对象进行推理,支持对工作存储区的查询访问等特点[1-2]. Jess语言本身提供了很多功能强大的函数供专家系统开发者调用,但这些函数不可能囊括一切功能和运算,若仅

C#中的扩展方法学习总结

??版权声明:本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为C#中的扩展方法学习总结,本文链接为http://qinyuanpei.com/2015/12/05/extend-methods-of-csharp/. ??各位朋友大家好,我是秦元培,欢迎大家关注我的博客.最近偶然接触到了C#中的扩展方法,觉得这个语法特性是一个不错的特性,因此决定在这里系统地对C#中的扩展方法相关内容进行下

扩展方法为我们带来了什么

一 发现问题 扩展方法的思考来源于这样的一次经历:在项目中开发程序时,经常这样使用List<T>和Dictionary<K,V>. <span style="white-space:pre"> </span> List<string> listTest = new List<string>(); listTest.ForEach(item => { //方法体略 }); Dictionary<strin

C#中的扩展方法及用途

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=476 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释.假设一个控制台程序cla

学习系列之扩展方法

一 扩展方法的定义 扩展方法能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异 从字面上按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的.可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且我们人为地去改变源代码有可能会破坏整个代码的稳定性.那么有没有一种方法能在不改变源代码的前提

C#3.0扩展方法学习篇

什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. Extension methods are a

扩展方法用法及其原理和注意事项

前言 一直以来尤其像C#一些常见的语法,本人更愿意去探讨其内部实现的原理,为什么要这么做呢?只是为了当我真正在开发中运用语法的时候不会因为犯常识性错误或者说因为一些注意事项未曾注意到而耽误一些无谓的时间,同时也能理解的更深入而不是仅仅停留在表面(或许理解也不是太透).(当然本人能力有限,太高深的东西必定是研究不明白了,也只有这能力了). 概念 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例

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

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.  它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.  仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Col

APK扩展文件介绍、功能及使用方法

APK扩展文件介绍 Android Market (Google Play Store)中每个APK文件的最大限制是50MB.如果您的程序中包含大量的数据文件,以前您只能把这些数据文件放到自己的服务器上,当用户启动程序的时候让用户去下载.现在这些数据文件可以直接上传到Android Market了.在新的Market控制台上传App的时候,可以添加扩展文件了. 如何使用扩展文件: 每个APK可以有2个扩展文件,每个文件最大限制是2GB.为了减少用户的带宽消耗,最好使用压缩格式文件吧. 这两扩展文