《Effective C#》读书笔记——条目10:使用可选参数减少方法重载的数量C#语言习惯...
C#4.0?引入了具名參數(shù)(MSDN翻譯為“命名實(shí)參”,個(gè)人認(rèn)為具名參數(shù)更形象,可選參數(shù)亦是)和可選參數(shù)(可選實(shí)參)。客戶端代碼使用具名參數(shù)意味著:方法中的參數(shù)名稱也成為了公有接口的一部分。假如修改公有參數(shù)的名稱將有可能破壞調(diào)用者的代碼。這意味著:調(diào)用者應(yīng)該盡可能的避免使用具名參數(shù),而作為API的設(shè)計(jì)者,也應(yīng)該避免修改公有貨受保護(hù)方法中參數(shù)的名稱。
當(dāng)然,并不是說具名參數(shù)是一無是處的,它也有自己的適用的場(chǎng)景。具名參數(shù)配合可選參數(shù)可以簡(jiǎn)化很多API的調(diào)用語(yǔ)法,特別是Microsoft Office的COM API。如下:
1 var wasted = Type.Missing; 2 var wordApp = new Microsoft.Office.Interop.Word.Application(); 3 wordApp.Visible = true; 4 5 Documents docs = wordApp.Documents; 6 Document doc = docs.Add(ref wasted, ref wasted, ref wasted); 7 8 Range range = doc.Range(0, 0); 9 range.InsertAfter("Testing,testing,testing...");?
任何的Office Interop應(yīng)用程序都要使用多次Type.Missing對(duì)象,這些毫無意義的代碼掩蓋了核心的邏輯;這是C#添加可選參數(shù)和具名參數(shù)主要原因。在添加可選參數(shù)后在Office API將會(huì)為可能使用Type.missing的地方創(chuàng)建默認(rèn)值,上面的代碼可以簡(jiǎn)化成這樣:
1 var wordApp = new Microsoft.Office.Interop.Word.Application(); 2 wordApp.Visible = true; 3 4 Documents docs = wordApp.Documents; 5 Document doc = docs.Add(); 6 7 Range range = doc.Range(0, 0); 8 range.InsertAfter("Testing,testing,testing...");?
?我們可以看到這個(gè)小小的修改增強(qiáng)了代碼的可讀性。現(xiàn)在假設(shè)你想創(chuàng)建一個(gè)新的Web頁(yè)面而不是一個(gè)Word文檔,而這時(shí)Add()方法的最后一個(gè)參數(shù),這種情況下可以使用具名參數(shù)來指定最后一個(gè)參數(shù):
1 var wordApp = new Microsoft.Office.Interop.Word.Application(); 2 wordApp.Visible = true; 3 Documents docs = wordApp.Documents; 4 5 object docType = WdNewDocumentType.wdNewWebPage; 6 Document doc = docs.Add(DocumentType: ref docType); 7 8 Range range = doc.Range(0, 0); 9 range.InsertAfter("Testing,testing,testing...");?具名參數(shù)的具體含義是:對(duì)于那些提供了默認(rèn)從參數(shù)的API,你可以僅提供要用到的那些參數(shù)。使用具名參數(shù)要比使用多個(gè)重載要簡(jiǎn)單得多。在上面的實(shí)例示例中的第六行的ADD方法具名參數(shù)使用了ref關(guān)鍵字,在COM場(chǎng)景的編程中使用C#4.0,ref參數(shù)也是可選的:因?yàn)镃OM本身都是通過引用傳遞對(duì)象的,所以幾乎所有的參數(shù)都會(huì)以引用的形式傳遞,即使這些參數(shù)不會(huì)被調(diào)用的方法修改。
在協(xié)作開發(fā)中,如果你的代碼需要供他人調(diào)用,不管你是否同意你的API使用者都可以在任意的地方使用具名參數(shù)調(diào)用你的方法,所以你必須將參數(shù)的名稱也當(dāng)作公有接口的一部分。修改參數(shù)名稱可能會(huì)導(dǎo)致客戶代碼無法通過編譯。
小節(jié):
對(duì)于程序集的第一次發(fā)布,可以隨意使用可選參數(shù)和具名參數(shù),并任意給出你想要提供的重載。但是在后續(xù)的發(fā)布中,必須為額外的參數(shù)創(chuàng)建重載。這樣才能保證現(xiàn)有的程序仍然能夠正常運(yùn)行;并且在后續(xù)發(fā)布中要避免修改參數(shù)名稱,因?yàn)閰?shù)名稱以及成為了公有接口的一部分。
?
參考資料&進(jìn)一步閱讀
命名實(shí)參和可選實(shí)參
轉(zhuǎn)載于:https://www.cnblogs.com/IPrograming/archive/2012/10/07/Effective_CSharp_10.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的《Effective C#》读书笔记——条目10:使用可选参数减少方法重载的数量C#语言习惯...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。