泛型方法和泛型扩展方法和扩展方法有什么区别?

时间:2015-06-07 19:41:48

标签: c# extension-methods difference

通用方法通用扩展方法扩展方法之间有什么区别?

4 个答案:

答案 0 :(得分:3)

MSDN

Generic method

  

泛型方法是使用类型参数

声明的方法
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

Extension method

  

扩展方法可让您添加&#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)

•扩展方法: 使用扩展方法可以为指定的类型添加一些额外的方法。 对于创建扩展方法

  
      
  1. 使用公共静态属性定义类。
  2.   
  3. 使用公共静态属性在类中定义方法。
  4.   
  5. 对于此参数关键字之前的方法定义的扩展方法.place的第一个参数。
  6.   
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;
    }
}
  
      
  1. 在其他类中调用扩展方法。
  2.   
       private void CallExtensionMethod()
    {
        string s = "123";
        s.TestExtinsionMethod();
    }

•通用方法: 使用泛型方法,您可以在运行时定义输出类型。 对于创建扩展方法

  
      
  1. 定义类。

  2.   
  3. 定义方法。在方法名称之前 T

  4.   
  5. 在方法名称&lt; ** T &gt; **。
  6. 之后   
     public T TestCastTo<T>(object obj)
    {
        return (T)obj;
    }
  
      
  1. 在其他类中调用Generic方法。
  2.   
     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
    {

    }
}

因此,通用扩展方法只是一个碰巧是通用的扩展方法