亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解C#中的擴展方法

 更新時間:2020年06月01日 12:01:34   作者:炎炎設(shè)計  
下面這篇文章主要給大家介紹了關(guān)于c#中擴展方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),供大家學(xué)習(xí)參考,感興趣的朋友可以了解下

擴展方法(Extension Methods)是C#3.0時引入的新特性,相信很多人都聽過并且也都用過,最常見的是在LINQ中的使用。

不僅如此,在開發(fā)中,我們也可以創(chuàng)建自己擴展方法,使用它來優(yōu)化類的設(shè)計、簡化代碼。本文將簡單地介紹擴展方法的概念、定義、使用場景以及要注意的點。

一、概念

擴展方法是一種特殊類型的靜態(tài)方法。對于一個C#類型,如類(包括密封類)、值類型、接口等,擴展方法可以在不改變該類型源碼的前提下,為它的實例提供新的成員。因此,若要為一個框架或第三方庫的某個類型增加輔助功能,通過擴展方法就可以輕而易舉地實現(xiàn),這也是“擴展”的意義所在。

二、如何定義

創(chuàng)建擴展方法很簡單,有以下幾個步驟:

1、創(chuàng)建一個靜態(tài)類;

2、在其中創(chuàng)建一個靜態(tài)方法;

3、為這個靜態(tài)方法添加至少一個參數(shù),并在第一個參數(shù)前加上this關(guān)鍵字,這個關(guān)鍵字會告訴編譯器當(dāng)前方法是一個擴展方法。而這個方法將成為第一個參數(shù)所屬類型的新成員。

以下一個典型的擴展方法,用于為枚舉值提供一個可獲取其DescriptionAttribute特性值的方法:

namespace TLA. Infrastructure. Extensions
public static class EnumExtensions
{
public static string GetDescription(this Enum en)
{
Type type = en. GetType();
MemberInfo[] memInfo = type . GetMember(en. ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0] .
GetCustomAttributes (typeof (DescriptionAttribute), false);
if (attrs != null && attrs. Length > 0){
return ( (DescriptionAttribute )attrs [0]) . Description;
}
}
return en. ToString();
}
}
}

注意:只有在引用擴展方法所在的靜態(tài)類的命名空間后,才能使用它;否則,直接調(diào)用會編譯失敗。上例中,使用該擴展方法要引用TLA.Infrastructure.Extensions命名空間。

三、何時使用

從擴展方法的概念上,不難看出,它可以用在以下幾種場合:

1、要為某個類型擴展功能,但沒有其源碼,比如某個框架或第三方庫中的一個類;例如,想要獲取一個列表中所有的奇數(shù)項,就可以為IList<T>接口增加一個擴展方法,這里的IList<T>接口本身是.NET框架中的接口。

public static class IListExtentions
{
public static IEnumerable<T> OddItems<T>(this IEnumerable<T> list)
{
if (list == nu1l)
{
throw new ArgumentNullExcept ion (nameof(list)) ;
}
for (int i = 0; i < list. Count(); i++)
{
if(i%2==0)
{
yield return list. ElementAt(i);
}
}
}
}

2、即使可以訪問原有類型的源碼,也可以使用擴展方法為它添加輔助功能;

public interface ILog
{
void Log(string message, LogLevel logLevel);
}
public static class ILogExtensions
{
/// <summary>
///記錄調(diào)試信息
/// </summary>
/// <remarks>擴 展方法,方便記錄調(diào)試信息</ remarks>
public static void LogDebug(this ILog logger, string message )
{
if (true) // 判斷日志配置中是否允許輸入Debug類型的日志
{
logger? .Log($" {message}", LogLevel.Debug);
}
}
}

3、重用代碼,使代碼更簡潔;由于擴展方法封裝了一段完整的邏輯,所以,使用擴展方法就避免了復(fù)制粘貼代碼的情況。上例中擴展方法的內(nèi)容也符合這種使用場景。

四、注意事項
以下是定義與使擴展方法時的一些注意事項和最佳實踐:

1、擴展方法本質(zhì)上是為原有類型提供輔助功能,因此,在創(chuàng)建時,要確保它具有實際意義,且遵循單一職責(zé)原則;也即,不能過度使用擴展方法并且它能夠完成一個具體、完整的功能;

2、擴展方法本身具有通用性,因此,它里面應(yīng)避免特定的業(yè)務(wù)數(shù)據(jù)類型及其相關(guān)邏輯;

3、如果為接口增加擴展方法,擴展方法的命名空間可以與接口的一致;否則,應(yīng)盡量避免與原類型寫在同一命名空間下,這樣會“污染”原類型。建議的做法是為擴展方法所在的類設(shè)定一個單獨的命名空間,如:<Company>.<Product>.Extentions。不過,這樣做也有缺點:在操作原有類型的實例時,如果不引用擴展方法所在的命名空間,那么,它就不容易被發(fā)現(xiàn),而解決這個問題的辦法是,盡量將擴展方法文檔化,并告訴項目組的其他開發(fā)人員;

4、為接口增加擴展方法后,則所有實現(xiàn)此接口的類都會包含該擴展方法;
5、在擴展方法中,要對第一個參數(shù)進行非空檢查,如果為空,應(yīng)拋出ArgumentNullException(參數(shù)為空)異常。

相關(guān)文章

  • C# Double轉(zhuǎn)化為String時的保留位數(shù)及格式方式

    C# Double轉(zhuǎn)化為String時的保留位數(shù)及格式方式

    這篇文章主要介紹了C# Double轉(zhuǎn)化為String時的保留位數(shù)及格式方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C# 使用 log4net 日志組件的方法

    C# 使用 log4net 日志組件的方法

    這篇文章主要介紹了C# 使用 log4net 日志組件的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C# 中AutoMapper的使用方法

    C# 中AutoMapper的使用方法

    這篇文章主要介紹了C# 中AutoMapper的使用方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#訪問SqlServer設(shè)置鏈接超時的方法

    C#訪問SqlServer設(shè)置鏈接超時的方法

    這篇文章主要介紹了C#訪問SqlServer設(shè)置鏈接超時的方法,涉及CommandTimeout屬性的相關(guān)設(shè)置技巧,非常簡單實用,需要的朋友可以參考下
    2015-06-06
  • C#集合之隊列的用法

    C#集合之隊列的用法

    這篇文章介紹了C#集合之隊列的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Winform窗體如何改變語言類型

    Winform窗體如何改變語言類型

    這篇文章主要介紹了Winform窗體如何改變語言類型,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • c#文本加密程序代碼示例

    c#文本加密程序代碼示例

    這是一個加密軟件,但只限于文本加密,加了窗口控件的滑動效果,詳細(xì)看下面的代碼
    2013-11-11
  • 簡介C#讀取XML的兩種方式

    簡介C#讀取XML的兩種方式

    在程序中訪問進而操作XML文件一般有兩種模型,分別是使用DOM(文檔對象模型)和流模型,使用DOM的好處在于它允許編輯和更新XML文檔,可以隨機訪問文檔中的數(shù)據(jù),可以使用XPath查詢
    2013-03-03
  • Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(1)

    Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計(1)

    這篇文章主要為大家詳細(xì)介紹了Winform學(xué)生信息管理系統(tǒng)登陸窗體設(shè)計思路,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C#實現(xiàn)六大設(shè)計原則之迪米特法則

    C#實現(xiàn)六大設(shè)計原則之迪米特法則

    這篇文章介紹了C#實現(xiàn)六大設(shè)計原則之迪米特法則的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評論