非常简单的扩展方法外行解释';s术语(C#)

非常简单的扩展方法外行解释';s术语(C#),c#,.net,windows,methods,C#,.net,Windows,Methods,可能重复: 我知道以前有人问过这个问题,但有些问题可以提供一个非技术性的解释,用外行的术语尽可能简单 关于其他答案的所有文档对我来说似乎有点遥远嗯,编程本身就是“技术性的”,所以我会尽可能多地学习,以便理解文档。但是,扩展方法只允许您将类似实例方法的方法添加到现有类中,否则这些类将被关闭以进行修改 例如,如果我编写了一个库,其中包含一个类型Foo,并且没有分发源代码,那么您将无法对其进行子类化以添加任何功能,而这只有在我将该类型保留为“未密封”的情况下才有可能实现。随着扩展方法的出现,您可以向

可能重复:

我知道以前有人问过这个问题,但有些问题可以提供一个非技术性的解释,用外行的术语尽可能简单


关于其他答案的所有文档对我来说似乎有点遥远

嗯,编程本身就是“技术性的”,所以我会尽可能多地学习,以便理解文档。但是,扩展方法只允许您将类似实例方法的方法添加到现有类中,否则这些类将被关闭以进行修改


例如,如果我编写了一个库,其中包含一个类型
Foo
,并且没有分发源代码,那么您将无法对其进行子类化以添加任何功能,而这只有在我将该类型保留为“未密封”的情况下才有可能实现。随着扩展方法的出现,您可以向类中添加方法,您可以像调用任何其他方法一样调用这些方法(实际上,它们被实现为静态方法,将隐藏的第一个参数带到
Foo
的实例中,因此您仍然无法访问类的私有成员)。

,编程本质上是“技术性的”,所以我会尽可能多地学习,以便理解文档。但是,扩展方法只允许您将类似实例方法的方法添加到现有类中,否则这些类将被关闭以进行修改


例如,如果我编写了一个库,其中包含一个类型
Foo
,并且没有分发源代码,那么您将无法对其进行子类化以添加任何功能,而这只有在我将该类型保留为“未密封”的情况下才有可能实现。随着扩展方法的出现,您可以向类中添加方法,您可以像调用任何其他方法一样调用这些方法(实际上,它们被实现为静态方法,将隐藏的第一个参数带到
Foo
的实例中,因此您仍然无法访问类的私有成员).

扩展方法允许您向无法访问其源的类添加功能(方法)。

扩展方法允许您添加功能(方法)对于类,您无法访问它们的源。

扩展方法是一种在类型上模拟新方法而不实际更改类型定义本身的方法


我想一个外行的解释是,它给每一种类型它自己的个人随从。他们认为,人本身并没有被改造,他们只是凭借与他们交往的人获得了许多新的能力

扩展方法是一种在类型上模拟新方法而不实际更改类型定义本身的方法


我想一个外行的解释是,它给每一种类型它自己的个人随从。他们认为,人本身并没有被改造,他们只是凭借与他们交往的人获得了许多新的能力

我不认为这比下面的一句话简单得多:


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

我不认为它比下面的一句话简单得多:


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

您可以定义一个简单的类:

public class A
{
    public void B()
    {
        Console.WriteLine("B called");
        this.C();
    }
    public void C()
    {
        Console.WriteLine("C called");
    }
}
但是如果你得到一个定义为:

public class A
{
    public void C()
    {
        Console.WriteLine("C called");
    }
}
你想给它添加函数B吗?您可以使用扩展方法来执行此操作:

public class A
{
    public void C()
    {
        Console.WriteLine("C called");
    }
}
// the extensions class, can be any name, must be public
public class Extensions
{
    public static void B(    this                   A                 me)
 // ^ must be public static  ^ indicates extension  ^ type to extend  ^ name of variable instead of this
    {
        Console.WriteLine("B called");
        // instead of this, you use the name of variable you used in the parameters
        me.C();
    }
}

现在您可以像在第一个示例中一样调用
A.B()

您可以定义一个简单的类:

public class A
{
    public void B()
    {
        Console.WriteLine("B called");
        this.C();
    }
    public void C()
    {
        Console.WriteLine("C called");
    }
}
但是如果你得到一个定义为:

public class A
{
    public void C()
    {
        Console.WriteLine("C called");
    }
}
你想给它添加函数B吗?您可以使用扩展方法来执行此操作:

public class A
{
    public void C()
    {
        Console.WriteLine("C called");
    }
}
// the extensions class, can be any name, must be public
public class Extensions
{
    public static void B(    this                   A                 me)
 // ^ must be public static  ^ indicates extension  ^ type to extend  ^ name of variable instead of this
    {
        Console.WriteLine("B called");
        // instead of this, you use the name of variable you used in the parameters
        me.C();
    }
}

现在你可以像第一个例子那样调用
A.B()

@Michael:我已经投票决定结束这个问题。请参阅上面评论中的链接,该链接解释了它的用法&我相信,你会发现它很简单。@Michael:如果你不知道,请随时在答案上留下评论,以便澄清@沙卡尔佩什:我同意。如果该链接不能充分解释扩展方法,那么扩展方法可能不是解决问题的方法;)用外行的话来解释是不可能的。如果你是外行,你不需要知道什么是扩展方法,所以没问题。@Michael:想象一只狗。你不能改变狗的基因组成(当然,你可以,但这很难),但你可以给它一些溜冰鞋,让它跑得更快。溜冰鞋是一种延伸的方法——它们不会改变狗,它们只是让它变得更好。@Michael:我投票决定结束这个问题。请参阅上面评论中的链接,该链接解释了它的用法&我相信,你会发现它很简单。@Michael:如果你不知道,请随时在答案上留下评论,以便澄清@沙卡尔佩什:我同意。如果该链接不能充分解释扩展方法,那么扩展方法可能不是解决问题的方法;)用外行的话来解释是不可能的。如果你是外行,你不需要知道什么是扩展方法,所以没问题。@Michael:想象一只狗。你不能改变狗的基因组成(当然,你可以,但这很难),但你可以给它一些溜冰鞋,让它跑得更快。旱冰鞋是一种扩展方法——它们不会改变狗,只是让它变得更好。+1用于非技术性类比,尽管我必须阅读比扩展方法文档更多的内容;)+1对于非技术性的类比,尽管我必须比关于扩展方法的文档阅读更多次;)