技術交流QQ羣【JAVA,C++,Python,.NET,BigData,AI】:170933152
之前,給list添加排序的擴展方法的時候用過.下面的作用是去掉list中重複的數據.
/// </summary>
static class ListExtendMethod
{
/// <summary>
/// </summary>
/// <typeparam name="TSource">List</typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="source">List</param>
/// <param name="keySelector"></param>
/// <returns></returns>
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}
靜態類特徵:
1.不能用sealed或abstract修飾符;
2.必須直接繼承System.Object類型,不能試任何其他類的派生類;
3.不能實現任何接口;
4.不能包含任何操作符;
5.不能使用protected或者protected internal修飾的靜態成員;
6.只能包含靜態成員;
7.可以包含靜態構造函數,不能包含實例構造函數;
8.不能被實例化;
9.密封的,不能被繼承。
擴展方法特徵:
1.特殊的靜態方法位於靜態類中;
2.擴展方法的第一個參數以this修飾符爲前綴,後跟要擴展的目標類型及參數;
3.擴展方法所在的類必須在使用它的類可見範圍內,否則需使用using指令將命名空間顯示導入到當前源代碼中;
4.擴展方法只能針對實例調用,也就是說,目標類不能爲靜態類;
5.如果擴展方法和被擴展類中某個簽名相同,則擴展方法永遠不會被調用;
6.其他命名空間下的擴展方法優先級低於當前命名空間下的擴展方法的優先級,優先級最高爲實例方法。
例:
-
namespace TestExtensionMethods
-
{
-
//①必須建一個靜態類(任意有效命名),用來包含要添加的擴展方法
-
public static class MyExtensions
-
{
-
//②要添加的擴展方法必須爲一個靜態方法
-
public static int MyNewMethod(this string s)
-
{
-
return s.Length;
-
}
-
}
-
//測試擴展方法類
-
class Program
-
{
-
static voidMain(string[] args)
-
{
-
string str = "Hello Extension Methods in C# 3.0";
-
Console.WriteLine(str);
-
//③調用擴展方法,必須用對象來調用
-
int len = str.MyNewMethod();
-
Console.WriteLine(len);
-
Console.ReadKey();
-
}
-
}
-
}
根據上述實例,要使用擴展方法擴展數據類型(爲之添加新方法),首先必須創建一個靜態類,用來包含要添加的擴展方法。其次,要添加的新的擴展方法必須是一個靜態方法。
方法簽名包括方法的名稱以及參數信息(包括形參修飾符、數目、類型以及泛型參數的數目)。特別注意返回值類型、形參和類型參數的名稱並不屬於方法簽名的一部分。