zoukankan      html  css  js  c++  java
  • C#的扩展方法学习

    一,什么是扩展方法?

    1,扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

    2,扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

    3,扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

    4,扩展方法在非嵌套的、非泛型静态类内部定义的

    5,在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。

    6,扩展方法是静态方法,则也不能被重写

    Extension类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Extensions
    {
        //public static class Extension<T>  //提示扩展方法必须在非泛型静态类中定义
        public static class Extension
        {
            public static void MethodStr(this string i)
            {
                Console.WriteLine(i);
            }
        }
    }

    DefineIMyInterface接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DefineIMyInterface
    {
        public interface IMyInterface
        {
            void MethodStr();
        }
    }

    Program调用实现:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Extensions;
    using DefineIMyInterface;
    
    namespace ExtenMethod
    {
    
        class Test : IMyInterface
        {
            public void MethodStr()
            {
                Console.WriteLine("接口实现");
            }
        }
        class Test2
        {
            public void MethodStr()
            {
                Console.WriteLine("类的实现方法");
            }
        }class Program
        {
            private string pri = "2";
            static void Main(string[] args)
            {
                //在编译后,相同签名的方法,扩展方法的优先级总是比类型本身中定义的实例方法低,则实现的是接口和类的方法,
                //以下两个例子中:与接口或类方法具有相同名称和签名的扩展方法永远不会被调用,因为它的名称和签名与这些类已经实现的方法完全匹配。
                //可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 
                Test t = new Test();
                t.MethodStr();
    
                Test2 t2 = new Test2();
                t2.MethodStr();
    
                //实现扩展方法
                string extenmethod = "扩展方法实现";
                extenmethod.MethodStr();
    
                //扩展方法无法访问它们所扩展的类型中的私有变量。
                //在代码中,可以使用实例方法语法调用该扩展方法。但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。因此,并未真正违反封装原则。
                //pri.MethodStr();  //报错
            }
        }
    
    }
  • 相关阅读:
    Java入门系列-10-数组
    Java入门系列-09-循环结构
    Java入门系列-08-选择结构
    Java入门系列-07-从控制台中接收输入
    Java入门系列-06-运算符
    05-数据类型和类型转换
    004 java中的变量
    Filter过滤器实现同一地址手机和电脑页面不同
    Java 8 Lambda表达式10个示例【存】
    Centos7+Apache2.4+php5.6+mysql5.5搭建Lamp环境——为了wordPress
  • 原文地址:https://www.cnblogs.com/May-day/p/6477958.html
Copyright © 2011-2022 走看看