我知道这个问题以前已经问过,但也有的提供非易怒的解释,尽可能简单地用laymen的话来说。
所有其他答案文件似乎有点远,我
我知道这个问题以前已经问过,但也有的提供非易怒的解释,尽可能简单地用laymen的话来说。
所有其他答案文件似乎有点远,我
我不认为它会比从Wikipedia article的一句话简单得多:
“扩展方法使您能够‘添加’方法,以现有的类型,而无需创建一个新的派生类型,重新编译,或者修改原始类型“。如果你得到一个定义为
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添加到它
好,编程本质上是“易怒”,所以我会努力学习,就像你可以为了了解文档。但是,扩展方法仅允许您将方法的实例方法添加到现有的类中,否则这些类会被修改关闭。例如,如果我编写了一个包含Foo
类型的库并且未分发源代码,则您将被卡住继承它以添加任何功能,并且只有在我将该类型保留为“未密封”时才有可能。随着扩展方法的出现,您可以向类中添加方法,您可以像调用任何其他方法一样调用方法(实际上,它们是作为静态方法实现的,它会将一个隐藏的第一个参数应用于Foo
的实例,因此您仍然不会无法获得班级的私人成员)。
扩展方法允许您将功能(方法)添加到无法访问其源的类中。
扩展方法是一种在实际上模拟新方法而不实际更改类型定义本身的方法。
我想通俗一点的解释是,它给每一种类型都是自己的随从。他们本身并没有被修改,他们只是凭借与他们一起出游的人获得了许多新的能力。
+1为非技术类比,虽然我不得不阅读更多的时间比扩展方法的文档;) – Town 2011-05-17 15:53:33
可以定义一个简单的类?您可以使用扩展方法来做到这一点:
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:我已投票结束这个问题。请参阅上述评论中的链接,它解释了它的用法,我相信,你会发现它很简单。 – shahkalpesh 2011-05-17 15:47:28
@迈克尔:如果你不这样做,请随时留下澄清答案的意见! – adamjford 2011-05-17 15:49:18
@shahkalpesh:我同意。如果这个链接没有足够的解释扩展方法,那么扩展方法可能就不行了;) – Town 2011-05-17 15:50:57