freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

類庫開發(fā)的設(shè)計(jì)準(zhǔn)則結(jié)構(gòu)設(shè)計(jì)-資料下載頁

2025-06-27 05:45本頁面
  

【正文】 敏感的,則制作可變對象的私有副本并使用該副本進(jìn)行驗(yàn)證和處理。這僅適用于可變數(shù)據(jù)。不需要復(fù)制不可變數(shù)據(jù)(如 Uri 對象)。 傳遞參數(shù)方法參數(shù)可以通過值,通過引用傳遞,也可以作為輸出參數(shù)傳遞。通過值傳遞參數(shù)時(shí),方法獲取調(diào)用方數(shù)據(jù)的副本,但不能改變調(diào)用方的數(shù)據(jù)副本。通過引用傳遞參數(shù)時(shí),方法獲取指向調(diào)用方數(shù)據(jù)的指針。此數(shù)據(jù)與調(diào)用方共享。如果方法對引用參數(shù)做出更改,則這些更改是對調(diào)用方的數(shù)據(jù)進(jìn)行的。使用引用參數(shù)時(shí),方法可以使用數(shù)據(jù)的初始狀態(tài)。輸出參數(shù)與引用參數(shù)類似,不同之處在于,輸出參數(shù)以獨(dú)占方式用于向調(diào)用方返回?cái)?shù)據(jù),而引用參數(shù)可用于將數(shù)據(jù)傳入方法,也可用于從方法中接收數(shù)據(jù)。 避免使用輸出參數(shù)或引用參數(shù)。使用定義輸出參數(shù)或引用參數(shù)的成員需要開發(fā)人員理解指針、值類型和引用類型之間的細(xì)微差別以及輸出參數(shù)和引用參數(shù)之間的初始化差異。 不要通過引用傳遞引用類型。通過引用傳遞一個(gè)對象使方法能夠用不同的實(shí)例替換該對象。在大多數(shù)情況下,方法應(yīng)使用提供的對象,而不應(yīng)將其替換。對于此規(guī)則,有一些少量的例外(例如,可用于交換引用的方法)。 參數(shù)數(shù)目可變的成員數(shù)組用于將數(shù)目可變的參數(shù)傳遞給成員。某些語言(如 C)提供了一個(gè)關(guān)鍵字,用于修飾傳遞可變參數(shù)的數(shù)組。對于不提供關(guān)鍵字的語言,ParamArrayAttribute 屬性可提供此功能。該關(guān)鍵字和屬性影響成員簽名的最后一個(gè)參數(shù)。該參數(shù)必須是一維數(shù)組。下列準(zhǔn)則有助于了解何時(shí)使用可變數(shù)組作為參數(shù)是適合的和有益的。 如果需要最終用戶傳遞少量元素,則考慮向數(shù)組參數(shù)添加 params 關(guān)鍵字。通常,如果開發(fā)人員要傳遞很多元素,則 params 關(guān)鍵字可能用處不大,因?yàn)殚_發(fā)人員不太可能內(nèi)聯(lián)傳遞大量對象。 如果調(diào)用方幾乎總要將輸入放入數(shù)組,則不要使用 params 數(shù)組。例如,字節(jié)數(shù)據(jù)通常在字節(jié)數(shù)組中存儲和處理。通常,將 params 關(guān)鍵字添加到字節(jié)數(shù)組參數(shù)不能解決問題,因?yàn)殚_發(fā)人員通常不使用還未存儲到字節(jié)數(shù)組中的單個(gè)字節(jié)。 如果數(shù)組由采用 params 數(shù)組參數(shù)的成員進(jìn)行了修改,則不要使用 params 數(shù)組。公共語言運(yùn)行庫 (CLR) 可能已創(chuàng)建了一個(gè)臨時(shí)數(shù)組對象。如果方法修改臨時(shí)數(shù)組,則這些修改對調(diào)用方是不可用的。 考慮在簡單重載中使用 params 關(guān)鍵字,即使更復(fù)雜的重載不能使用它。在某個(gè)重載(即使不是所有重載)中使用 params 數(shù)組,對開發(fā)人員都是有好處的。 盡量對參數(shù)進(jìn)行排序,以使它能夠使用 params 關(guān)鍵字。這意味著,只要可能,數(shù)組參數(shù)就應(yīng)該是指定的最后一個(gè)參數(shù)。 考慮在性能極為敏感的 API 中為使用少量參數(shù)的調(diào)用提供特殊重載和代碼路徑。按照此準(zhǔn)則,在調(diào)用帶有少量參數(shù)的成員時(shí)可以避免創(chuàng)建數(shù)組。參數(shù)名稱應(yīng)為數(shù)組參數(shù)的單數(shù)形式,后跟一個(gè)數(shù)字后綴。 注意 null(在 Visual Basic 中為 Nothing)可以作為 params 數(shù)組參數(shù)進(jìn)行傳遞。在處理 null 數(shù)組之前,成員應(yīng)對其進(jìn)行檢查。 不要使用 varargs 方法,這種方法以省略號的形式表示。因?yàn)?varargs 調(diào)用約定不符合 CLS,所以不應(yīng)在公共成員中使用。它可以在內(nèi)部使用。 指針參數(shù)指針是一項(xiàng)高級編程功能,只應(yīng)該在十分注重性能的情況下使用。指針允許對內(nèi)存地址進(jìn)行訪問。下面的準(zhǔn)則有助于確保您的庫設(shè)計(jì)可有效使用指針。 避免對指針參數(shù)進(jìn)行高開銷的參數(shù)檢查。您通常應(yīng)該檢查參數(shù);但是,對于對性能敏感的成員,參數(shù)檢查的開銷通常是不值得的。 在設(shè)計(jì)帶指針的成員時(shí),要遵守與指針相關(guān)的慣常約定。例如,成員不需要將起始索引作為參數(shù),因?yàn)榭梢允褂煤唵蔚闹羔標(biāo)惴▉硖峁┲羔樀刂?,該指針地址作為添加到相?yīng)起始索引位置的指針基地址。 4 擴(kuò)展性設(shè)計(jì)擴(kuò)展性是添加或修改對象行為的能力。可以使用很多種不同的機(jī)制使庫成為可擴(kuò)展庫。每種不同的機(jī)制都有其自己的優(yōu)缺點(diǎn)。 未密封的類其他類可以從未密封類繼承。許多其他擴(kuò)展性機(jī)制(如受保護(hù)成員和虛成員)要求類是未密封的。這些附加機(jī)制為添加或自定義類型的功能提供了功能強(qiáng)大的方式,但需要大量開銷。即使沒有附加擴(kuò)展性機(jī)制,未密封類在許多開發(fā)方案中也非常有用。 考慮一種很好的方式,即采用不具有虛成員或受保護(hù)成員的未密封類,向框架提供資源開銷少的適用擴(kuò)展性。默認(rèn)情況下,大多數(shù)類都不應(yīng)是密封的。這樣,開發(fā)人員才能根據(jù)他們的特定情況來自定義類。例如,如果某個(gè)類是未密封的,則開發(fā)人員可以向從該類派生的類型添加一個(gè)構(gòu)造函數(shù),然后使用該構(gòu)造函數(shù)將基類屬性初始化為所需的值。開發(fā)人員還可以添加一些方法重載,用于傳遞方案特定的默認(rèn)值。 受保護(hù)的成員未密封類的受保護(hù)成員為開發(fā)人員提供了一種自定義類行為的方式。例如,引發(fā)事件的方法通常定義為具有受保護(hù)的可見性,以允許派生類在引發(fā)該事件之前或之后提供其他處理。重要說明:術(shù)語“受保護(hù)”并不意味著進(jìn)行任何安全檢查或調(diào)用方驗(yàn)證。只需通過定義聲明類型的派生類,即可訪問受保護(hù)的成員。 出于安全、文檔和兼容性分析方面的考慮,將未密封類的受保護(hù)成員視為公共成員。任意代碼都可以通過創(chuàng)建子類來訪問受保護(hù)成員。 事件和回調(diào)回調(diào)方法是一種在操作或活動完成時(shí)由委托自動調(diào)用的方法。例如,某一異步設(shè)計(jì)模式使用 AsyncCallback 委托指定在異步操作完成時(shí)執(zhí)行的代碼。該設(shè)計(jì)模式用在 BeginWrite 方法中,該方法使用回調(diào)處理異步寫操作的結(jié)果。 事件是與回調(diào)類似的機(jī)制。事件允許在特定的情況下執(zhí)行用戶指定的代碼,這些情況通常涉及狀態(tài)更改或活動的開始或結(jié)束。事件比回調(diào)易于使用,因?yàn)檎Z言語法和工具為識別和處理事件提供了統(tǒng)一的編碼做法。此外,事件由稱為事件處理程序的委托處理,這些委托具有定義完善的簽名模式。有關(guān)事件的更多信息,請參見事件設(shè)計(jì)。 下列準(zhǔn)則可幫助確保您的庫設(shè)計(jì)根據(jù)最佳做法使用事件和回調(diào)。 避免在對性能敏感的 API 中使用回調(diào)。盡管回調(diào)和事件對于許多開發(fā)人員來說更易于理解和使用,但從性能和內(nèi)存消耗的角度看,它們不如虛成員可取。 要了解調(diào)用委托將會執(zhí)行任意代碼,這可能會造成安全性、正確性和兼容性方面的問題。事件和回調(diào)允許在公共語言運(yùn)行庫 (CLR) 的上下文中執(zhí)行任意代碼。在檢查代碼和安全性時(shí),要仔細(xì)檢查這些擴(kuò)展點(diǎn)以確定是否存在安全漏洞。 虛成員virtual(在 Visual Basic 中為 Overridable)成員允許通過提供該成員的不同實(shí)現(xiàn)來更改成員行為。如果類型的派生類要處理給定的特定情況,通常會使用虛成員。例如,WebRequest 類定義向任何統(tǒng)一資源定位符 (URI) 發(fā)送請求的功能。FtpWebRequest 類是 WebRequest 的派生類,前者重寫后者的虛方法,以處理向使用文件傳輸協(xié)議 (FTP) 方案的 URI 發(fā)送請求。 虛成員的性能高于回調(diào)和事件,但是不比非虛方法高。 必要時(shí)才可使用虛成員,還應(yīng)對設(shè)計(jì)、測試和維護(hù)虛成員所需的開銷有所了解。在不同版本之間更改虛成員的實(shí)現(xiàn)可能會導(dǎo)致不易察覺的版本不兼容。因此,正確設(shè)計(jì)和徹底測試虛成員的開銷是很大的。 關(guān)于可訪問性,首選使用受保護(hù)成員,而不是公共成員。公共成員應(yīng)通過調(diào)用受保護(hù)虛成員提供擴(kuò)展性(如果需要)。不涉及繼承的所有情況都需要使用的成員應(yīng)該是公共的。 抽象類型和接口抽象類型和接口是用于指定編程抽象的兩種機(jī)制。抽象指定繼承者或?qū)嵤┱弑仨氉裱囊粋€(gè)協(xié)定。抽象類型可以選擇提供實(shí)現(xiàn)的詳細(xì)信息;而接口不能提供實(shí)現(xiàn)的任何詳細(xì)信息。 除非通過開發(fā)若干使用抽象的具體實(shí)現(xiàn)和 API 對抽象進(jìn)行了測試,否則不要提供抽象。如果在實(shí)際方案中未對抽象進(jìn)行測試就提供了抽象,將很有可能遺漏一些設(shè)計(jì)問題;而且,對這些問題的修復(fù)很可能甚至必然導(dǎo)致在以后的版本中引入兼容性問題。 在設(shè)計(jì)抽象時(shí),則要在抽象類與接口之間謹(jǐn)慎選擇。有關(guān)選擇抽象類型還是接口的詳細(xì)討論,請參見在類和接口之間選擇。 考慮為抽象的具體實(shí)現(xiàn)提供引用測試。通過這樣的測試,用戶應(yīng)可以測試出抽象的實(shí)現(xiàn)是否正確地履行了協(xié)定。通過引用測試,可以驗(yàn)證是否正確實(shí)現(xiàn)了某一接口。例如,對 ICollection(Of (T)) 進(jìn)行的測試可以驗(yàn)證:在對實(shí)現(xiàn)該接口的實(shí)例兩次調(diào)用 Add 方法后,Count 屬性是否增加 2。 用于實(shí)現(xiàn)抽象的基類用于實(shí)現(xiàn)抽象的基類是設(shè)計(jì)用于幫助開發(fā)人員實(shí)現(xiàn)抽象類和接口(抽象)的類。這些基類為抽象提供了一些實(shí)現(xiàn)細(xì)節(jié),在某些情況下不用繼承就可以使用它們。例如,可以使用 Collection(Of (T)) 創(chuàng)建一個(gè)集合,也可以從其進(jìn)行繼承以定義強(qiáng)類型集合類。CollectionBase 類是 .NET Framework 基類的另一個(gè)示例。該類可幫助開發(fā)人員實(shí)現(xiàn)非泛型集合。與 Collection(Of (T)) 不同的是,CollectionBase 不能直接使用。只有用于實(shí)現(xiàn)抽象的基類能為使用庫的開發(fā)人員帶來很大價(jià)值時(shí),才應(yīng)將這些基類作為庫的一部分予以提供。如果某一基類只用于幫助實(shí)現(xiàn)庫,則該基類不應(yīng)是公共可見的。若要在內(nèi)部使用基類來簡化庫開發(fā)工作,公共成員應(yīng)將工作委托給該基類,而不是從該基類繼承。 如果基類設(shè)計(jì)用于公共 API 中,則在命名時(shí)避免為基類使用 Base 后綴。如果庫將基類作為返回類型或參數(shù)類型公開,則該基類不應(yīng)帶有 Base 后綴。 通過密封類限制擴(kuò)展性可以使用密封來限制開發(fā)人員可以擴(kuò)展您的框架的方式。如果密封了某個(gè)類,則其他類不能從該類繼承。如果密封了某個(gè)成員,則派生類不能重寫該成員的實(shí)現(xiàn)。默認(rèn)情況下,不應(yīng)密封類型和成員。密封可防止對庫的類型和成員進(jìn)行自定義,也會影響某些開發(fā)人員對可用性的認(rèn)識。此外,使用面向?qū)ο蟮目蚣苓€有一個(gè)重要優(yōu)點(diǎn),即擴(kuò)展性。如果所作決定不能體現(xiàn)出這一優(yōu)點(diǎn),請仔細(xì)權(quán)衡。 除非有充分的理由,否則不要密封類。不要因?yàn)轭A(yù)見不到需要擴(kuò)展某個(gè)類的情形,就認(rèn)為將其密封起來是合適的。如果類滿足如下條件,則應(yīng)將其密封:類是靜態(tài)類。類包含帶有安全敏感信息的繼承的受保護(hù)成員。類繼承多個(gè)虛成員,并且密封每個(gè)成員的開發(fā)和測試開銷明顯大于密封整個(gè)類。類是一個(gè)要求使用反射進(jìn)行快速搜索的屬性。密封屬性可提高反射在檢索屬性時(shí)的性能。 不要在密封類型中聲明受保護(hù)成員或虛成員。如果類型是密封的,則它不能有派生類。受保護(hù)成員只能從派生類進(jìn)行訪問,虛成員也只能在派生類中重寫。 考慮密封重寫的成員??梢允褂眠@種方式來確保派生類不會修改或跳過當(dāng)前類和所有派生類所需的行為。 5 異常設(shè)計(jì)準(zhǔn)則異常是報(bào)告錯誤的標(biāo)準(zhǔn)機(jī)制。應(yīng)用程序和庫不應(yīng)使用返回代碼來傳遞錯誤信息。異常的采用增進(jìn)了框架設(shè)計(jì)的一致性,允許無返回類型的成員(如構(gòu)造函數(shù))報(bào)告錯誤。異常還允許程序處理錯誤或根據(jù)需要終止運(yùn)行。默認(rèn)行為是在應(yīng)用程序不處理引發(fā)的異常時(shí),終止應(yīng)用程序。有關(guān) .NET Framework 中的異常的詳細(xì)介紹,請參見處理和引發(fā)異常。 異常引發(fā)當(dāng)某一成員無法成功執(zhí)行它應(yīng)執(zhí)行的操作時(shí),將引發(fā)異常。這稱為執(zhí)行故障。例如,如果 Connect 方法無法連接到指定的遠(yuǎn)程終結(jié)點(diǎn),則這就是一個(gè)執(zhí)行故障,將有一個(gè)異常被引發(fā)。 下列準(zhǔn)則可幫助確保在適當(dāng)時(shí)引發(fā)異常。 不要返回錯誤代碼。異常是報(bào)告框架中的錯誤的主要手段。異常設(shè)計(jì)準(zhǔn)則討論了使用異常的許多好處。 盡可能不對正??刂屏魇褂卯惓!3讼到y(tǒng)故障及可能導(dǎo)致爭用狀態(tài)的操作之外,框架設(shè)計(jì)人員還應(yīng)設(shè)計(jì)一些 API 以便用戶可以編寫不引發(fā)異常的代碼。例如,可以提供一種在調(diào)用成員之前檢查前提條件的方法,以便用戶可以編寫不引發(fā)異常的代碼。有關(guān)可以減少異常引發(fā)數(shù)量的設(shè)計(jì)方案的其他信息,請參見異常和性能。 不要包含可以根據(jù)某一選項(xiàng)引發(fā)或不引發(fā)異常的公共成員。 不要包含將異常作為返回值或輸出參數(shù)返回的公共成員。此項(xiàng)準(zhǔn)則適用于公共可見的成員。使用私有幫助器方法構(gòu)造和初始化異常是可以接受的。 考慮使用異常生成器方法。從不同的位置引發(fā)同一異常會經(jīng)常發(fā)生。為了避免代碼膨脹,請使用幫助器方法創(chuàng)建異常并初始化其屬性。幫助器方法不得引發(fā)異常,否則堆棧跟蹤將無法正確反映出引發(fā)異常的調(diào)用堆棧。 不要從異常篩選器塊中引發(fā)異常。當(dāng)異常篩選器引發(fā)異常時(shí),公共語言運(yùn)行庫 (CLR) 將捕獲該異常,然后該篩選器返回 false。此行為與篩選器顯式執(zhí)行和返回 false 的行為無法區(qū)分,因此很難調(diào)試。有些語言(如 C)不支持異常篩選器。 避免從 finally 塊中顯式引發(fā)異常??梢越邮芤蛘{(diào)用引發(fā)異常的方法而隱式引發(fā)的異常。 選擇要引發(fā)的正確異常類型下列設(shè)計(jì)準(zhǔn)則可幫助您確保正確地使用現(xiàn)有異常,并在適當(dāng)?shù)臅r(shí)候創(chuàng)建對您的庫有價(jià)值的新異常。 考慮引發(fā) System 命名空間中的現(xiàn)有異常,而不是創(chuàng)建自定義異常類型。有關(guān) .NET Framework 所提供的最常用異常類型的詳細(xì)準(zhǔn)則,請參見捕捉和引發(fā)標(biāo)準(zhǔn)異常類型。 如果錯誤狀態(tài)可以通過不同于現(xiàn)有任何其他異常的方法以編程方式進(jìn)行處理,則要創(chuàng)建并引發(fā)自定義異常。否則,引發(fā)一個(gè)現(xiàn)有異常。有關(guān)創(chuàng)建自定義異常的詳細(xì)準(zhǔn)則,請參見設(shè)計(jì)自定義異常。 引發(fā)適當(dāng)?shù)淖罹唧w(派生程度最大)的異常。例如,如果某方法收到一個(gè) null(在 Visual Basic 中為 Nothing)參數(shù),則該方法應(yīng)引發(fā) ,而不是引發(fā)該異常的基類型 。 包裝異常若要包裝某個(gè)異常,請將該異常指定為某個(gè)新異常的內(nèi)部異常,然后引發(fā)該新異常。僅在原始異常對于接收該異常的用戶沒有意義,或異常的調(diào)用堆棧易混淆或沒有用處時(shí),才應(yīng)進(jìn)行這種處理。例如,考慮一個(gè)為基于 XML 的配置文件提供管理功能的庫。配置文件管理器在內(nèi)部使用 XML 讀取器來讀取文件。如果配置文件的格式錯誤,則 XML 讀取器可能會引發(fā)異常,其中包括一條消息和用于 XML 讀取器及其支持類型的調(diào)用堆棧詳細(xì)信息,而這些對于應(yīng)用程序用戶都沒有意義。在這種情況下,就適合由配置文件管理器來包裝 XML 讀取器異常并再次引發(fā)一個(gè)指示問題真實(shí)性質(zhì)的新異常。下面的準(zhǔn)則有助于確保僅在適當(dāng)時(shí)正確包裝異常。 如果低層異常在高層操作的上下文中沒
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1