C#吾日三省吾身

儘可能避免少的裝箱拆箱:函數

string a = "a" + 0;
string b = "a" + 0.ToString(); //高效
//ToString()是直接經過操做內存來完成int到string的轉換,效率比裝箱高不少

  ArrayList和List<T>,儘可能使用List而不用ArrayList,ArrayList會進行拆箱裝箱操做,存值會轉換成Object存儲(裝箱),取值再轉換成對應類型(拆箱);List<T>就不會post

字符串大量操做使用StringBuilderui

區別const 和 readonly的使用方法this

const效率高,編譯期常量,自然就是static,不能再前面增長static關鍵字修飾.通過編譯器編譯以後.在代碼中引用const的地方會用const變量所對應的實際值來代替.只能修飾基元類型,枚舉類型或字符串類型編碼

readonly效率能夠,運行時常量,第一次被賦值後將不可改變,修飾沒有限制readonly屬於類實例的成員,要使他成爲類的成員,須要在前面加上static,這樣就能夠直接使用類名調用.(構造函數,變量初始化均可以賦值)spa

重載運算符code

class Test
{
    public int par;
    public static Test operator +(Test a,Test b)
    {
      a.par += b.par;
      return a;
    }
}

== 和 Equals對象

Equals用於引用類型的相等性比較,==用於值類型的相等性比較 blog

若是用來比較的兩個變量所包含的數值相等,那麼將其定義爲「值相等」;接口

若是比較的兩個變量引用的是同一內存,那麼將其定義爲「引用相等」。

dynamic與var (dynamic沒搞懂)

dynamic是FrameWork4.0的新特性。dynamic的出現讓C#具備了弱語言類型的特性。編譯器在編譯的時候再也不對類型進行檢查,編譯期默認dynamic對象支持你想要的任何特性。好比,即便你對GetDynamicObject方法返回的對象一無所知,你也能夠像以下那樣進行代碼的調用,編譯器不會報錯:

dynamic dynamicObject = GetDynamicObject();
Console.WriteLine(dynamicObject.Name);
Console.WriteLine(dynamicObject.SampleMethod());

實際上,var和dynamic徹底是兩個概念,根本不該該放在一塊兒作比較。var其實是編譯期拋給咱們的「語法糖」,一旦被編譯,編譯期會自動匹配var 變量的實際類型,並用實際類型來替換該變量的申明,這看上去就好像咱們在編碼的時候是用實際類型進行申明的。而dynamic被編譯後,實際是一個object類型,只不過編譯器會對dynamic類型進行特殊處理,讓它在編譯期間不進行任何的類型檢查,而是將類型檢查放到了運行期。

foreach不支持循環時增刪操做

若是在foreach中增/刪某一元素,則會拋出異常。

緣由:foreach循環使用了迭代器進行集合的遍歷,它在FCL提供的迭代器內部維護了一個對集合版本的控制。

集合版本:簡單來講就是一個整型變量,任何對集合的增刪操做都會使版本號+1。

foreach循環會調用MoveNext方法來便利元素,MoveNext方法內部會進行版本號的檢測,一旦版本號變更,就會拋異常。

必要時將再也不使用的對象引用賦值爲null

delegate與event

public delegate void ActionCall();

public event ActionCall call;

//委託能夠賦值(=)和綁定(+= -=),事件只能綁定(+= -=)

//事件在本類能夠調用,其餘類中不能調用;

 拓展方法:不改變原類,給類添加方法

public class Test
{
    public void Action()
    {
    }
}
//擴展方法必須在靜態類中,擴展方法必須是靜態的
public static class TestExtension
{
    public static void ActionExtension(this Test t) //第一個參數必須是要擴展的類型,且必須加上了this關鍵字
    {
    }
   public static void ActionExtension1(this Test t, int a)
    {
    }
} 
//這個時候就能夠調用拓展方法了
Test t = new Test();
t.ActionExtension();
t.
ActionExtension1(0);
 
   

注意:不支持擴展事件和屬性,可是能夠擴展接口

避免雙向耦合

雙向耦合指兩個類型之間互相引用.通常來講,類型之間不該該存在雙向耦合,若是出現,則考慮重構。

相關文章
相關標籤/搜索