讀改善c#程式碼157個建議:建議1~3

K戰神發表於2015-07-14

目錄:

  • 建議一:正確操作字串
  • 建議二:使用預設轉型方法
  • 建議三:區別對待強制轉型和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 都行。

相關文章