改善C 程式的157個建議(1)

2021-10-06 12:02:13 字數 3193 閱讀 4188

2. 使用預設轉型方法

3. 區別對待強制轉型與as和is

1)避免裝箱

什麼是裝箱?

指將乙個值型別隱式的轉換為object型別。

裝箱為什麼會帶來效能損耗?

因為它需要完成下面三個步驟:

1)會為值型別在託管堆中分配記憶體。除了使用值型別本身所分配的記憶體空間外,記憶體總量還要加上型別物件指標和同步塊索引所占用的記憶體。

2)將值型別的值分配到堆記憶體中

3)返回已經成為引用型別的位址。

應如何避免裝箱?

1)警惕隱式轉換

2)使用泛型

2)避免分配額外的記憶體空間

1)字串拼接時,盡量使用stringbuilder

對於clr來說,string物件是個很特殊的物件。它一旦被賦值就不可變。在執行時呼叫string類中的任何方法和進行任何運算(「=」 賦值,「+」拼接等),都會在記憶體中建立乙個新的字串物件,這也意味要為該新物件分配新的記憶體空間。

例如:

string str1 =

"abc"

;str1 = str1 +

"123"

+"567"

;//建立2個字串,並進行一次字串拼接

string str2 =

"abc"

;str2 =

"123"

+ str2 +

"567"

;//建立3個字串,並進行一次字串拼接

string str3 =9+

"456"

;//建立1個字串,並進行一次字串拼接

string str4 =

"123"

+"456"

+"567"

;//建立1個字串,不會進行一次字串拼接

const

string str5 =

"str"

;string str6 =

"123"

+ str5 +

"567"

;//建立1個字串,不會進行一次字串拼接

il反編譯:

stringbuilder並不會重新建立乙個string物件,她的效率源於預先以非託管的方式分配記憶體。如何stringbuilder沒有先定義長度,則預設分配的長度為16位,當字元長度小於等於16時,stringbuilder不會重新分配記憶體;當字串長度大於16小於32時,stringbuilder又會重新分配記憶體,使之成為16的倍數。所以我們需要注意:stringbuilder指定的長度要合適,太小了,需要頻繁分配記憶體,太大了,浪費空間。

3)string.format()

也可以使用此函式進行優化,因為format方法在內部使用了stringbuilder進行字串的格式化。

1)使用型別的轉換運算子

使用型別的轉化運算子,其實就是適用型別內部的乙個方法(即函式)。轉換運算子分為兩類:隱式和顯示轉換。

例如:

int i =0;

float j =0;

j = i;

//int到float存在乙個隱式轉換

i =(

int) j;

//float到int存在,而且必須是乙個顯示轉換

2)使用型別內建的parse,tryparse,或者如tostring,todouble,todatetime等方法

可以使用如system.convert類,system.bitconverter類來進行型別的轉換

system.convert:提供了將乙個基元型別轉換為其他基元型別的方法。還支援將任何自定義型別轉換為任意基元型別,只要自定義型別繼承iconvertible介面就可以。

system.bitconverter:提供了基元型別與位元組陣列之間相互轉換的方法。

4)使用clr支援的轉型????

clr支援的轉型,即上溯轉型和下溯轉型。

1)強制轉型是什麼?

secondtyp=(secondtype)firsttype;

強制轉型意味著兩件不同的事情:

class

program

;//secondtype second = (secondtype) firsttype;//轉型成功

//secondtype second = firsttype as secondtype;//轉型失敗,編譯出錯

//編譯成功,執行失敗:

//編譯器首先判斷的是:secondtype與object之間是否存在繼承關係。

//因為在c#中所有的型別都是繼承自object的,所有下面的**編譯不會出錯

//但是在執行時,編譯器會自動產生**來檢查obj是不是secondtype,這樣就繞過了轉換操作符,所以會轉換失敗。

//secondtype second = dowithsomet(firsttype);

secondtype second =

dowithsome

(firsttype)

;//執行成功

console.

readkey()

;}//當obj不是secondtype時會報錯。

static

secondtype

dowithsomet

(object obj)

//使用as操作符永遠不會拋異常

static

secondtype

dowithsome

(object obj)

return secondtype;}}

class

firsttype

}class

secondtype

public

static

explicit

operator

secondtype

(firsttype firsttype)

;return secondtype;}}

}

建議:

該內容**於:

學無止境time—c# as與is的區別

改善C 程式的157個建議 讀書筆記

1.正確操作字串 最大的體會是程式的效率是好習慣帶出來的。多用stringbuilder和string.format吧。2.使用預設轉型方法 盡量使用系統原有方法,至於如何找到方法?就問度娘哈。3.區別對待強制轉換與as和is 反正我是慎用了。基本原則能用第一,效率第二。4.tryparse比par...

改善C 程式 的N個建議 6 10

建議6 分清readonly和const的使用方法.首先區分他們的各自特點.readonly 執行時常量.const 編譯期常量 決定了它肯定是靜態的 只能修飾基元型別 string 也是屬於基元型別 和列舉型別.或許有人會問了,執行時常量和編譯期常量有什麼區別呢?那就先看一下 片段 public ...

改善c 程式建議 其他

1 c 編寫死迴圈一般使用 while 1 2 關鍵字static有三個明顯的作用 1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。3 在模組內,...