目錄:
- 建議一:正確操作字符串
- 建議二:使用默認轉型方法
- 建議三:區別對待強制轉型和as
建議一、正確操作字符串
1、確保盡量少的裝箱
static void Main(string[] args) { int indexNo = 1; int dbNo = 4; string text = "I-" + indexNo + "D" + dbNo; Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo, dbNo); Console.ReadKey(); }
我們知道值類型轉引用類型會產生裝箱操作,裝箱操作—為值類型在托管堆中分配內存以及類型對象指針和同步塊索引的內存,將值類型拷貝到新分配的堆內存中,最后返回這個對象的地址。
反面:
string text = "I-" + indexNo + "D" + dbNo; Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo, dbNo);
正面:
string text = "I-" + indexNo.ToString() + "D" + dbNo.ToString(); Console.WriteLine("IndexNo:{0},DBNo:{1}", indexNo.ToString(), dbNo.ToString());
2、避免分配額外的內存空間
String類型是特殊的引用類型,它一旦賦值就不可改變。我們所調用的"="或者"+"進行拼接都會創建一個新字符串。
反面:我們實際創建了4個string對象
string text = "I-" + indexNo.ToString() + "D" + dbNo.ToString();
正面:
使用:StringBuilder對象
StringBuilder strder = new StringBuilder(); strder.Append("I-"); strder.Append(indexNo.ToString()); strder.Append("D-"); strder.Append(dbNo.ToString()); string text = strder.ToString();
根據 asdshit 的建議補充,這一點確實不知道,被忽略了:
StringBuilder()對象默認分配的空間是16字符。當空間滿了之后,會再分配16個字符空間。
所以說如果我們可以正確估計我們的數據的字符總長度。正確的設定初始空間,這樣,使得StringBuilder不必頻繁地開辟分配空間。也避免大量的空間被浪費
使用:String.Format()方法
String.Format("I-{0}D-{1}", indexNo.ToString(), dbNo.ToString());
建議二、使用默認轉型方法
1、類型轉換運算符:強制轉換
int indexNo = 1; float f = (float)indexNo;
2、使用類型內置轉換方法
Parse、TryParse 或者 ToString(),TodateTime
3、使用幫助類System.Convert提供的方法
建議三、區別對待強制轉型與as和is
基類轉型為子類本身使用as.
子類和子類之間的轉型應該是提供轉換操作符。
1、強制轉型:
- 兩個類型之間通過支持強制轉型操作符來完成兩個類型之間的轉型。
- 兩個類屬於從屬繼承關系。
第一種情況:類型實現強制轉換
class FirstType { public string Name { get; set; } } class SecondType { public string Name { get; set; } public explicit operator SecondType(FirstType firstType) { SecondType st = new SecondType() { Name = "轉型自:" + firstType.Name }; return st; }
FirstType ft = new FirstType(); ft.Name = "First"; SecondType st = (SecondType)ft; Console.WriteLine(st.Name);
第二種情況:繼承關系:強制轉換或者as 都行。