成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#基礎(chǔ)之C#代碼的注意事項(xiàng)(上)

開發(fā) 后端
本文介紹的是我們寫C#代碼的一些注意事項(xiàng),主要為大家介紹了50個(gè)方面的。希望對(duì)大家有幫助,一起來看。

關(guān)于代碼優(yōu)化的問題,之前也給大家介紹過相關(guān)的內(nèi)容。下面介紹的是C#代碼優(yōu)化的一些注意事項(xiàng),供參考。

一、用屬性代替可訪問的字段

1、.NET數(shù)據(jù)綁定只支持?jǐn)?shù)據(jù)綁定,使用屬性可以獲得數(shù)據(jù)綁定的好處;

2、在屬性的get和set訪問器重可使用lock添加多線程的支持。

二、readonly(運(yùn)行時(shí)常量)和const(編譯時(shí)常量)

1、const只可用于基元類型、枚舉、字符串,而readonly則可以是任何的類型;

2、const在編譯時(shí)將替換成具體的常量,這樣如果在引用中同時(shí)使用了const和readonly兩種值,則對(duì)readonly的再次改變將會(huì)改變?cè)O(shè)計(jì)的初衷,這是需要重新編譯所更改的程序集,以重新引用新的常量值。

3、const比readonly效率高,但失去了應(yīng)用的靈活性。

三、is與as

1、兩者都是在運(yùn)行時(shí)進(jìn)行類型的轉(zhuǎn)換,as操作符只能使用在引用類型,而is可以使用值和引用類型;

2、通常的做法是用is判斷類型,然后選擇使用as或強(qiáng)類型轉(zhuǎn)換操作符(用operater定義的轉(zhuǎn)換)有選擇地進(jìn)行。

四、ConditionalAttribute代替#if #endif條件編譯

1、ConditionalAttribute只用于方法級(jí),對(duì)其他的如類型、屬性等的添加都是無效的;而#if #endif則不受此限制;

2、ConditionalAttribute可以添加多個(gè)編譯條件的或(OR)操作,而#if #endif則可以添加與(AND)[這里可以完全定義為另一個(gè)單獨(dú)的符號(hào)];

3、ConditioanlAttribute定義可以放在一個(gè)單獨(dú)的方法中,使得程序更為靈活。

五、提供ToString()方法

1、可以更友好的方式提供用戶詳細(xì)的信息;

2、使用IFormatter.ToString()方法提供更靈活的定制,如果添加IFormatProvider 和ICustomFormatter接口則更有意義的定制消息輸出。

六、值和引用類型的區(qū)別

1、值類型不支持多態(tài),適合存儲(chǔ)應(yīng)用程序操作的數(shù)據(jù),而引用則支持多態(tài),適用于定義應(yīng)用程序的行為;

2、對(duì)于數(shù)組定義為值類型可以顯著提高程序的性能;

3、值類型具有較少的堆內(nèi)存碎片、內(nèi)存垃圾和間接訪問時(shí)間,其在方法中的返回是以復(fù)制的方式進(jìn)行,避免暴露內(nèi)部結(jié)構(gòu)到外界;

4、值類型應(yīng)用在如下的場(chǎng)景中:類型的職責(zé)主要是用于數(shù)據(jù)存儲(chǔ);公共接口完全由一些數(shù)據(jù)成員存取屬性定義;永遠(yuǎn)沒有子類;永遠(yuǎn)沒有多態(tài)行為。

七、值類型盡可能實(shí)現(xiàn)為常量性和原子性的類型

1、使我們的代碼更易于編寫和維護(hù);

2、初始化常量的三種策略:在構(gòu)造中;工廠方法;構(gòu)造一個(gè)可變的輔助類(如StringBuilder)。

八、確保0為值得有效狀態(tài)

1、值類型的默認(rèn)狀態(tài)應(yīng)為0;

2、枚舉類型的0不應(yīng)為“無效的狀態(tài)”;在FlagsAttribute是應(yīng)確保0值為有效地狀態(tài);

3、在字符串為為空時(shí)可以返回一個(gè)string.Empty的空字符串;

九、相等判斷的多種表示關(guān)系

1、ReferenceEquals()判斷引用相等,需要兩個(gè)是引用同一個(gè)對(duì)象時(shí)方可返回true;

2、靜態(tài)的Equals()方法先進(jìn)性引用判斷再進(jìn)行值類型判斷的;

3、對(duì)于引用類型的判斷可以在使用“值語義”時(shí)使用重寫Equals()方法;

4、重寫Equals()方法時(shí)也應(yīng)當(dāng)重寫GetHashCode()方法,同時(shí)提供operater==()操作。

十、理解GetHashCode()方法的缺陷

1、GetHashCode()僅應(yīng)用在基于散列的集合定義鍵的散列值,如HashTable或Dictionary;

2、GetHashCode()應(yīng)當(dāng)遵循相應(yīng)的三條規(guī)則:兩個(gè)相等對(duì)象應(yīng)當(dāng)返回相同的散列碼;應(yīng)當(dāng)是一個(gè)實(shí)例不變式;散列函數(shù)應(yīng)該在所有的整數(shù)中產(chǎn)生一個(gè)隨機(jī)的分布;

十一、優(yōu)先使用foreach循環(huán)語句

1、foreach可以消除編譯器對(duì)for循環(huán)對(duì)數(shù)組邊界的檢查;

2、foreach的循環(huán)變量是只讀的,且存在一個(gè)顯式的轉(zhuǎn)換,在集合對(duì)象的對(duì)象類型不正確時(shí)拋出異常;

3、foreach使用的集合需要有:具備公有的GetEnumberator()方法;顯式實(shí)現(xiàn)了IEnumberable接口;實(shí)現(xiàn)了IEnumerator接口;

4、foreach可以帶來資源管理的好處,因?yàn)槿绻幾g器可以確定IDisposable接口時(shí)可以使用優(yōu)化的try…finally塊;

十二、默認(rèn)字段的初始化優(yōu)于賦值語句

1、字段生命默認(rèn)會(huì)將值類型初始化為0,引用類型初始化為null;

2、對(duì)同一個(gè)對(duì)象進(jìn)行多次初始化會(huì)降低代碼的執(zhí)行效率;

3、將字段的初始化放到構(gòu)造器中有利于進(jìn)行異常處理。

十三、使用靜態(tài)構(gòu)造器初始化靜態(tài)成員

1、靜態(tài)構(gòu)造器會(huì)在一個(gè)類的任何方法、變量或者屬性訪問之前執(zhí)行;

2、靜態(tài)字段同樣會(huì)在靜態(tài)構(gòu)造器之前運(yùn)行,同時(shí)靜態(tài)構(gòu)造器有利于異常處理。

十四、利用構(gòu)造器鏈(在.NET 4.0已經(jīng)用可選參數(shù)解決了這個(gè)問題)

1、用this將初始化工作交給另一個(gè)構(gòu)造器,用base調(diào)用基類的構(gòu)造器;

2、類型實(shí)例的操作順序是:將所有的靜態(tài)字段都設(shè)置為0;執(zhí)行靜態(tài)字段初始化器;執(zhí)行基類的靜態(tài)構(gòu)造器;執(zhí)行當(dāng)前類型的靜態(tài)構(gòu)造器;

將所有的實(shí)例字段設(shè)置為0;執(zhí)行實(shí)例字段初始化器;執(zhí)行合適的基類實(shí)例構(gòu)造器;執(zhí)行當(dāng)前類型的實(shí)例構(gòu)造器。

十五、利用using和try/finally語句來清理資源

在IDisposable接口的Dispose()方法中用GC.SuppressFinalize()可通知垃圾收集器不再執(zhí)行終結(jié)操作。

十六、盡量減少內(nèi)存垃圾

1、分配和銷毀一個(gè)對(duì)上的對(duì)象都要花費(fèi)額外的處理器時(shí)間;

2、減少分配對(duì)象數(shù)量的技巧:經(jīng)常使用的局部變量提升為字段;提供一個(gè)類,用于存儲(chǔ)Singleton對(duì)象來表達(dá)特定類型的常用實(shí)例。

3、用StringBuilder進(jìn)行復(fù)雜的字符串操作。

十七、盡量減少裝箱和拆箱

1、關(guān)注一個(gè)類型到System.Object的隱式轉(zhuǎn)換,同時(shí)值類型不應(yīng)該被替換為System.Object類型;

2、使用接口而不是使用類型可以避免裝箱,即將值類型從接口實(shí)現(xiàn),然后通過接口調(diào)用成員。

十八、實(shí)現(xiàn)標(biāo)準(zhǔn)Dispose模式

1、使用非內(nèi)存資源,它必須有一個(gè)終結(jié)器,垃圾收集器在完成沒有終結(jié)其的內(nèi)存對(duì)象后會(huì)將實(shí)現(xiàn)了終結(jié)器對(duì)象的添加到終結(jié)隊(duì)列中,然后垃圾收集器會(huì)啟動(dòng)一個(gè)新的線程來運(yùn)行這些對(duì)象上的終結(jié)器,這種防御性的變成方式是因?yàn)槿绻脩敉浟苏{(diào)用Dispose()方法,垃圾回收器總是會(huì)調(diào)用終結(jié)器方法的,這樣可以避免出現(xiàn)非托管的內(nèi)存資源不被釋放引起內(nèi)存泄漏的問題;l

2、使用IDisposable.Dispose()方法需要做四個(gè)方面的工作:釋放所有的非托管資源;釋放所有的托管資源;設(shè)置一個(gè)狀態(tài)標(biāo)記來表示是否已經(jīng)執(zhí)行了Dispose();調(diào)用GC.SuppressFinalize(this)取消對(duì)象的終結(jié)操作;

3、為需要多態(tài)的類型添加一個(gè)受保護(hù)的虛方法Dispose(),派生類通過重寫這個(gè)方法來釋放自己的任務(wù);

4、在需要IDisoposable接口的類型中,即使我們不需要一個(gè)終結(jié)器也應(yīng)該實(shí)現(xiàn)一個(gè)終結(jié)器。

十九、定義并實(shí)現(xiàn)接口優(yōu)于繼承類型

1、不相關(guān)的類型可以共同實(shí)現(xiàn)一個(gè)共同的接口,而且實(shí)現(xiàn)接口比繼承更容易;

2、接口比較穩(wěn)定,他將一組功能封裝在一個(gè)接口中,作為其他類型的實(shí)現(xiàn)合同,而基類則可以隨著時(shí)間的推移進(jìn)行擴(kuò)展。

二十、明辨接口實(shí)現(xiàn)和虛方法重寫

1、在基類中實(shí)現(xiàn)一個(gè)接口時(shí),派生類需要使用new來隱藏對(duì)基類方法的使用;

2、可以將基類接口的方法申明為虛方法,然后再派生類中實(shí)現(xiàn)。

二十一、使用委托表達(dá)回調(diào)

1、委托對(duì)象本身不提供任何異常捕獲,所以任何的多播委托調(diào)用都會(huì)結(jié)束整個(gè)調(diào)用鏈;

2、通過顯示調(diào)用委托鏈上的每個(gè)委托目標(biāo)可以避免多播委托僅返回最后一個(gè)委托的輸出。

二十二、使用事件定義外部接口

1、應(yīng)當(dāng)聲明為共有的事件,讓編譯器為我們創(chuàng)建add和renmove方法;

2、使用System.ComponentModel.EventHandlerList容器來存儲(chǔ)各個(gè)事件處理器,在類型中包含大量事件時(shí)可以使用他來隱藏所有事件的復(fù)雜性。

二十三、避免返回內(nèi)部類對(duì)象的引用

1、由于值類型對(duì)象的訪問會(huì)創(chuàng)建一個(gè)該對(duì)象的副本,所以定義一個(gè)值類型的的屬性完全不會(huì)改變類型對(duì)象內(nèi)部的狀態(tài);

2、常量類型可以避免改變對(duì)象的狀態(tài);

3、定義接口將訪問限制在一個(gè)子集中從而最小化對(duì)對(duì)象內(nèi)部狀態(tài)的破壞;

4、定義一個(gè)包裝器對(duì)象來限制另一個(gè)對(duì)象的訪問;

5、希望客戶代碼更改內(nèi)部數(shù)據(jù)元素時(shí)可以實(shí)現(xiàn)Observer模式,以使對(duì)象可以對(duì)更改進(jìn)行校驗(yàn)或相應(yīng)。

二十四、聲明式編程優(yōu)于命令式編程

可以避免在多個(gè)類似的手工編寫的算法中犯錯(cuò)誤的可能性,并提供清晰和可讀的代碼。

二十五、盡可能將類型實(shí)現(xiàn)為可序列化的類型

1、類型表示的不是UI控件、窗口或者表單,都應(yīng)使類型支持序列化;

2、在添加了NonSerializedAttribute的反序列化的屬性時(shí)可以通過實(shí)現(xiàn)IDeserializationCallback的OnDeserialization()方法裝入默認(rèn)值;

3、在版本控制中可以使用ISerializable接口來進(jìn)行靈活的控制,同時(shí)提供一個(gè)序列化的構(gòu)造器來根據(jù)流中的數(shù)據(jù)初始化對(duì)象,在實(shí)現(xiàn)時(shí)還要求SerializationFormatter異常的許可。

4、如果需要?jiǎng)?chuàng)建派生類則需要提供一個(gè)掛鉤方法供派生類使用。

由于本文過長(zhǎng)的原因,分為兩篇為大家介紹,請(qǐng)看下一篇>>

【編輯推薦】

  1. C#多線程中l(wèi)ock的用法
  2. C#控件的閃爍問題解決方法總結(jié)
  3. 走進(jìn)C#基礎(chǔ)概念之事件
  4. 關(guān)于C#委托你不可不知的幾件事
  5. 利用C#實(shí)現(xiàn)任務(wù)欄通知窗口
責(zé)任編輯:于鐵 來源: saiyo
相關(guān)推薦

2011-07-06 09:46:56

C#

2009-09-01 17:25:33

初學(xué)C#編程

2009-08-06 16:13:16

C# Web Serv

2011-04-22 09:14:26

C#委托

2011-07-06 11:04:42

C#正則表達(dá)式

2009-08-25 17:59:49

C#入門

2021-03-15 08:18:23

C#反射模塊

2010-12-22 10:21:17

C#基礎(chǔ)

2011-06-08 14:22:51

延遲加載

2011-07-06 10:14:46

C#

2009-08-25 17:15:50

C#隱藏C#重寫C#重載

2010-01-18 16:12:16

CC++語言

2010-01-18 14:25:19

使用C++Builde

2009-08-25 16:32:24

C#語言

2009-08-13 18:02:50

C#基礎(chǔ)概念

2009-08-27 11:43:31

C#語法

2009-08-19 15:38:59

C#代碼

2009-08-25 17:21:31

C#索引

2010-01-14 18:19:40

C++語言

2010-01-25 18:12:28

C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品自产拍在线观看蜜 | 日本在线精品视频 | 欧美一区二区三区在线免费观看 | 成人在线视频观看 | 亚洲欧美一区二区三区视频 | 国产一区二区三区免费观看在线 | 欧美一区日韩一区 | 在线不卡一区 | 性色视频在线观看 | 超碰地址 | 国产精品高潮呻吟久久 | 中文字幕av一区二区三区 | 免费v片 | 久久免费香蕉视频 | 久久久久久av | 日韩一区二区av | 成年人在线视频 | 国产一区二区久久久 | 久久99这里只有精品 | 九九精品在线 | 久久九九免费 | 国产高清在线精品 | 日本污视频 | 色婷婷一区二区三区四区 | 精品久久一区二区 | 一区二区中文字幕 | 亚洲精品久久 | 全免费a级毛片免费看视频免 | 成人免费视频播放 | 一级片免费视频 | 国产视频精品在线观看 | 久久一级 | 国产日韩免费观看 | 国产999精品久久久 精品三级在线观看 | 欧美www在线观看 | 国产精品久久国产精品 | 午夜视频一区 | 色吊丝2| 亚洲乱码国产乱码精品精的特点 | 黄色在线免费观看 | 色婷婷久久久久swag精品 |