泛型方法、泛型扩展方法和扩展方法有什么区别?
MSDN中的通用方法。
通用方法是使用类型参数声明的方法。
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
这个方法会交换lhs(左侧)和rhs(右侧)之间的引用。由于我们只想交换引用而不关心引用底层类型是什么,因此可以将该方法声明为具有类型参数T的通用方法。这意味着它可以是任何类型。这样可以避免编写多个Swap方法。
string s1 = "hello";
string s2 = "world";
Swap(ref s1, ref s2);
int i1 = 5;
int i2 = 12;
Swap(ref i1, ref i2);
假设我们想扩展现有的字符串类以包含计算字符串中单词数量的方法。扩展方法使您能够“添加”方法到现有类型中,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
string s = "Hello Extension Methods";
int i = s.WordCount();
这对于向现有类(例如来自第三方程序集)添加功能(方法)非常有用,而您无法访问它们。
通用扩展方法只是前两个概念的混合。
通用方法与常规方法的调用方式相同,唯一的区别是可以通过指定通用类型来用于不同类型。
someObject.GenericMethodFromSameClass<String>();
通用扩展方法和扩展方法在某种意义上相似,它们都可以在它们扩展的对象上调用。它们之间的区别就像普通方法和通用方法之间的区别一样。someObject.ExtensionMethodFromOtherClass();
someObject.GenericExtensionMethodFromOtherClass<String>();
• 扩展方法: 使用扩展方法可以为指定的类型添加一些额外的方法。 创建扩展方法的步骤如下:
- 定义一个带有public static属性的类。
- 在类中定义一个带有public static属性的方法。
- 对于方法的第一个参数,定义扩展方法时,在该参数之前加上关键字this。
public static class TestExtensionClass
{
public static string TestExtinsionMethod(this string password)
{
string encriptedPassword="";
byte[] ASCIIValues = Encoding.ASCII.GetBytes(password);
foreach (byte b in ASCIIValues)
{
encriptedPassword += b.ToString();
}
return encriptedPassword;
}
}
private void CallExtensionMethod()
{
string s = "123";
s.TestExtinsionMethod();
}
• 通用方法: 使用通用方法,您可以在运行时定义输出类型。 要创建扩展方法
定义类。
定义方法。在方法名称之前放置T。
- 在方法名称之后放置<**T>**。
public T TestCastTo<T>(object obj)
{
return (T)obj;
}
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
• 通用扩展方法: • 通过结合属性扩展方法和泛型方法,您可以获得通用的扩展方法。
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
在其他类中调用通用扩展方法
private void CallGenericExtensionMethod()
{
string s = "123";
int i = s.TestCastTo<int>();
}
方法可以是通用的或非通用的,例如:
public void Foo() { } // Non-Generic Method
public void Foo<T>(T value) { } // Generic Method
扩展方法是用于扩展类型行为而无需修改类型本身的方法。比如,如果你想让 String
类型具有 Reverse
方法,可以在 String 类型上定义一个扩展方法,如下所示:
public static class ExtMethods
{
public static string Reverse(this string s) // Non-Generic Extension Method
{
// code to reverse string
}
}
扩展方法必须声明为静态并位于静态类中,同时其第一个参数必须在扩展的类型之前加上this
。
同样,扩展方法可以是泛型的:
public static class ExtMethods
{
public static Foo<T>(this T obj) // Generic extension method
{
}
}