泛型方法和泛型扩展方法、扩展方法有什么区别?
What is the difference between generic method and generic extension method and extension method?
通用方法和通用扩展方法和扩展方法有什么区别?
泛型方法的调用方式和普通方法一样,不同的是它可以通过指定泛型类型来用于不同的类型。
someObject.GenericMethodFromSameClass<String>();
通用扩展方法和扩展方法在某种意义上彼此相似,它们可以在它们扩展的对象上调用。它们之间的区别与常规方法和泛型方法之间的区别相同。
someObject.ExtensionMethodFromOtherClass();
someObject.GenericExtensionMethodFromOtherClass<String>();
• 扩展方法:
使用扩展方法可以向指定的 type 添加一些额外的方法。
对于创建扩展方法
- Definition class with public static attribute.
- Definition method in class with public static attribute.
- For first parameter of method defined extension method .place before this parameter keyword 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;
}
}
- In other classes call extension method.
private void CallExtensionMethod()
{
string s = "123";
s.TestExtinsionMethod();
}
• 通用方法:
使用通用方法,您可以在运行时定义输出类型。
对于创建扩展方法
Definition class.
Definition method. Before name of method place T.
- After name of method place <**T>**.
public T TestCastTo<T>(object obj)
{
return (T)obj;
}
- In other classes call Generic method.
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
• 通用扩展方法:
• 通过组合属性扩展方法和通用方法,您可以获得通用扩展方法。
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
在其他 class 中调用通用扩展方法
private void CallGenericExtensionMethod()
{
string s = "123";
int i = s.TestCastTo<int>();
}
Generic method 来自 MSDN。
A generic method is a method that is declared with type parameters
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 方法参数来编写示例,但这会导致不必要的值类型开销,称为装箱。
Extension method 来自 MSDN
Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.
假设我们想要扩展现有的字符串 class 以包含一种计算字符串中单词的方法。
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
现在我们可以计算任何字符串对象中的单词。
string s = "Hello Extension Methods";
int i = s.WordCount();
这对于向现有 classes 添加您无权访问 的功能(方法)特别有用(例如,来自第三方程序集)。
通用扩展方法只是前两个概念的混合。
方法可以是通用或非通用,例如:
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 并且在 static class 中,而且它的第一个参数必须有 this
在它扩展的类型之前。
同样,扩展方法可以是通用的:
public static class ExtMethods
{
public static Foo<T>(this T obj) // Generic extension method
{
}
}
因此,通用扩展方法只是一个恰好是通用的扩展方法。
通用方法和通用扩展方法和扩展方法有什么区别?
泛型方法的调用方式和普通方法一样,不同的是它可以通过指定泛型类型来用于不同的类型。
someObject.GenericMethodFromSameClass<String>();
通用扩展方法和扩展方法在某种意义上彼此相似,它们可以在它们扩展的对象上调用。它们之间的区别与常规方法和泛型方法之间的区别相同。
someObject.ExtensionMethodFromOtherClass();
someObject.GenericExtensionMethodFromOtherClass<String>();
• 扩展方法: 使用扩展方法可以向指定的 type 添加一些额外的方法。 对于创建扩展方法
- Definition class with public static attribute.
- Definition method in class with public static attribute.
- For first parameter of method defined extension method .place before this parameter keyword 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;
}
}
- In other classes call extension method.
private void CallExtensionMethod()
{
string s = "123";
s.TestExtinsionMethod();
}
• 通用方法: 使用通用方法,您可以在运行时定义输出类型。 对于创建扩展方法
Definition class.
Definition method. Before name of method place T.
- After name of method place <**T>**.
public T TestCastTo<T>(object obj)
{
return (T)obj;
}
- In other classes call Generic method.
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
• 通用扩展方法: • 通过组合属性扩展方法和通用方法,您可以获得通用扩展方法。
public static T TestCastTo<T>(this object obj)
{
return (T)obj;
}
在其他 class 中调用通用扩展方法
private void CallGenericExtensionMethod()
{
string s = "123";
int i = s.TestCastTo<int>();
}
Generic method 来自 MSDN。
A generic method is a method that is declared with type parameters
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 方法参数来编写示例,但这会导致不必要的值类型开销,称为装箱。
Extension method 来自 MSDN
Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.
假设我们想要扩展现有的字符串 class 以包含一种计算字符串中单词的方法。
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
现在我们可以计算任何字符串对象中的单词。
string s = "Hello Extension Methods";
int i = s.WordCount();
这对于向现有 classes 添加您无权访问 的功能(方法)特别有用(例如,来自第三方程序集)。
通用扩展方法只是前两个概念的混合。
方法可以是通用或非通用,例如:
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 并且在 static class 中,而且它的第一个参数必须有 this
在它扩展的类型之前。
同样,扩展方法可以是通用的:
public static class ExtMethods
{
public static Foo<T>(this T obj) // Generic extension method
{
}
}
因此,通用扩展方法只是一个恰好是通用的扩展方法。