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

本文关键字:扩展 方法 什么 区别 泛型方法 泛型 | 更新日期: 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>();

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

  1. 定义具有public static属性的类。
  2. 在类中定义具有public static属性的方法
  3. 对于方法定义的扩展方法的第一个参数,在该参数之前放置关键字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();
        }
    

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

    1. 定义类。

    2. 定义方法。方法名称前放置T

    3. 方法地方后
    4. & 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
        {
        }
    }
    

    所以,一个泛型扩展方法只是一个扩展方法碰巧是泛型的。