zoukankan      html  css  js  c++  java
  • .NET新特性扩展方法

    最近新采用vs2008进行开发,其中大致了解了一下.net3.5中的新特性。

    今天就新特性之扩展方法,其功能类似于老版本当中的继承。

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

    扩展方法的行为和静态方法非常的类似,你只能在静态类中声明它们。为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,而且你的第一个参数必定是你所扩展的类型实例。

    最常见的扩展方法是 LINQ 标准查询运算符,不过因为刚刚接触,所以在这里就不提具体的LINQ应用,用一个简单的实例来进行说明。

    首先,我们我们定义一个类型Door,编译为dll

    public class Door
    {
        private bool state;
        //定义门的开闭状态属性
        public bool DoorState
        {
            get { return state; }
            set { state = value; }
        }
        //开启门
        public void Open()
        {
            state = true;
        }
    }
    因为需要,我们需要考虑再为其类型增加一个关闭功能

    但类型已经封装,按照传统的方法我们可以声明一个扩展类ExDoor来添加我们需要的功能,但通过基类型实例是无法访问到我们扩展的方法的,只能通过扩展类型实例去访问。

    而在.net 3.5当中,这一切通过扩展方法就变得相当容易处理,而且无需改过其访问方式,直接通过原类型实例即可访问扩展方法。

    下面我们来为Door定义一个扩展

    static class DoorExpand
    {
        //关闭门
        public static void Close(this Door door)
        {
            door.DoorState = false;
        }
    }

    最后我们测试一下

    Door door = new Door();
    door.Open();
    Response.Write(door.DoorState.ToString());

    Response.Write("<br \>");
    door.Close();
    Response.Write(door.DoorState.ToString());

    输出结果为:True

                     False

    很明显我们的扩展已经起作用,然而我们的访问不需要做任何的改变。这一点来说还是比较好用哈

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/symbol441/p/1254316.html
Copyright © 2011-2022 走看看