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 在模組內,...