扩展方法是可以继承的,假如扩展了一个基类,所有扩展方法在派生类中也可以使用。 但是,和所有扩展方法一样,这里有优先问题,如果在继承链中出现了一个相同的签名(方法名),那么就会优先于扩展方法,也就是会将现有的扩展方法覆盖,而且不会发出警告。代码如下: 主函数:Program.cs public class PdaItem { public void Write() { Console.WriteLine("PdaItem"); } } class Appointment : PdaItem { } class Contact : PdaItem { public void Extnesion() { Console.WriteLine("Contact"); } } class Program { static void Main(string[] args) { Appointment a = new Appointment(); a.Extnesion(); //结果:Extnesion //这个继承链中有相同的签名 Contact c = new Contact(); c.Extnesion(); //結果:Contact Console.ReadLine(); } }扩展方法类:MyExtnesion.cs public static class MyExtnesion { public static void Extnesion(this PdaItem p) { Console.WriteLine("Extnesion"); } }这样会导致继承的破坏
Thread.Sleep
这种函数你说能扩展到谁身上去?更不要说一些无参的静态函数了。
建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
2.
扩展方法无法帮助我们建立一个清楚的版本控制机制,因为一旦在被扩展的类型中添加了一个匹配的签名,就会将现有的扩展方法覆盖,而且不会发出警告。如果对被扩展的类的源代码没有控制权,这个问题还会变得更加突出。
另外一个问题在于,虽然Visual Studio的“智能感知”功能支持扩展方法,但假如只是查看调用代码(也就是调用了扩展方法的代码),是不易看出一个方法是不是扩展方法的。总而言之,要慎用扩展方法。---- 《C#本质论》
但是,和所有扩展方法一样,这里有优先问题,如果在继承链中出现了一个相同的签名(方法名),那么就会优先于扩展方法,也就是会将现有的扩展方法覆盖,而且不会发出警告。代码如下:
主函数:Program.cs
public class PdaItem
{
public void Write()
{
Console.WriteLine("PdaItem");
}
} class Appointment : PdaItem
{ } class Contact : PdaItem
{
public void Extnesion()
{
Console.WriteLine("Contact");
}
} class Program
{
static void Main(string[] args)
{
Appointment a = new Appointment();
a.Extnesion(); //结果:Extnesion //这个继承链中有相同的签名
Contact c = new Contact();
c.Extnesion(); //結果:Contact Console.ReadLine();
}
}扩展方法类:MyExtnesion.cs
public static class MyExtnesion
{
public static void Extnesion(this PdaItem p)
{
Console.WriteLine("Extnesion");
}
}这样会导致继承的破坏
别这么直接比如我一个很简单的例子,我有一个扩展方法:public static int? ToInt32<T>(this T val);我本意是希望在处理数据的时候可以便利 的使用这个方法,可惜,我常常在一个普通的类实例中,看到这个函数,这是相当的“不爽”。
建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
2.
扩展方法无法帮助我们建立一个清楚的版本控制机制,因为一旦在被扩展的类型中添加了一个匹配的签名,就会将现有的扩展方法覆盖,而且不会发出警告。如果对被扩展的类的源代码没有控制权,这个问题还会变得更加突出。
另外一个问题在于,虽然Visual Studio的“智能感知”功能支持扩展方法,但假如只是查看调用代码(也就是调用了扩展方法的代码),是不易看出一个方法是不是扩展方法的。总而言之,要慎用扩展方法。
——MSDN
Thread.Sleep
这种函数你说能扩展到谁身上去?更不要说一些无参的静态函数了。