通用方法和通用扩展方法和扩展方法之间有什么区别?
答案 0 :(得分:3)
泛型方法是使用类型参数
声明的方法
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扩展方法可让您添加&#34;现有类型的方法,无需创建新的派生类型,重新编译或以其他方式修改原始类型。
让我们说我们想扩展现有的字符串类,以包含一个计算字符串中单词的方法。
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
现在我们可以计算任何字符串对象中的单词。
string s = "Hello Extension Methods";
int i = s.WordCount();
这对于向您无法访问的现有类添加功能(方法)特别有用(例如,来自第三方程序集)。
通用扩展方法只是前两个概念的混合。
答案 1 :(得分:1)
泛型方法与常规方法一样被调用,不同之处在于它可以通过指定泛型类型用于不同类型。
someObject.GenericMethodFromSameClass<String>();
通用扩展方法和扩展方法在某种意义上彼此相似,可以在它们扩展的对象上调用它们。它们之间的差异与常规方法和通用方法之间的差异相同。
someObject.ExtensionMethodFromOtherClass();
someObject.GenericExtensionMethodFromOtherClass<String>();
答案 2 :(得分:0)
•扩展方法: 使用扩展方法可以为指定的类型添加一些额外的方法。 对于创建扩展方法
- 使用公共静态属性定义类。
- 使用公共静态属性在类中定义方法。
- 对于此参数关键字此之前的方法定义的扩展方法.place的第一个参数。
醇>
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 &gt; **。
之后 醇>
public T TestCastTo<T>(object obj)
{
return (T)obj;
}
- 在其他类中调用Generic方法。
醇>
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>();
}
答案 3 :(得分:0)
方法可以是泛型或非泛型,例如:
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
{
}
}
因此,通用扩展方法只是一个碰巧是通用的扩展方法。