泛型方法与泛型扩展方法和扩展方法有什么区别?
本文关键字:扩展 方法 什么 区别 泛型方法 泛型 | 更新日期: 2023-09-27 17:54:28
泛型方法和泛型扩展方法和扩展方法有什么区别?
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);
虽然可以使用对象类型作为Swap方法参数来编写示例,但这会导致被称为装箱的值类型的不必要的开销。
通过MSDN扩展方法
扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
假设我们想扩展现有的string类,以包含一个计数字符串中单词的方法。
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
- & lt; * * 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
}
}
扩展方法必须声明为static,并且在静态类中,它的第一个参数必须在它扩展的类型之前具有this
。
public static class ExtMethods
{
public static Foo<T>(this T obj) // Generic extension method
{
}
}
所以,一个泛型扩展方法只是一个扩展方法碰巧是泛型的。