object/var/dynamic、ArrayList/HashTable/List/Dictionary、拆箱裝箱、LINQ

object/var/dynamic、ArrayList/HashTable/List/Dictionary、拆箱裝箱、LINQ

【object/var/dynamic】

object:是根型別,但使用前必須要轉型(int或string或其他)

var:會編譯器自動推斷型別,但編譯器判斷後無法指定其他型別內容給它

dynamic:具有動態語言特性的靜態型別?只在執行時辨識型別,不需轉型,之後也可指定其他型別給它

 

【ArrayList/HashTable/List/Dictionary】

ArrayList:初始化不需聲明長度,可以用for跟foreach遍歷    

ArrayList arrList = new ArrayList();
arrList.Add(object value); //添加單一元素
arrList.AddRange(new string[] {"你", "我", "他"}); //添加字串集合元素
arrList.RemoveAt(1); //移除索引[1]的元素
arrList.Sort(); //升冪排序
arrList.Reverse(); //若想降冪排序,則升冪排序後反轉即可

HashTable:鍵值對集合,只能用foreach遍歷

Hashtable hash = new Hashtable();
foreach(var item in hash.key) //鍵集合遍歷
{
    Console.WriteLine(item);
}
foreach(var item in hash.Values) //值集合遍歷
{
    Console.WriteLine(item);
}
foreach (DictionaryEntry item in hash) //鍵值對遍歷
{
    Console.WriteLine(item.Key + " " + item.Value);
}
hash.add(object key,object value); //添加鍵值對
hash.Contains(key) //判斷是否包含某個鍵
hash.ContainsValue() //判斷是否包含某個值
hash.Remove("sk"); //根據鍵移除對應元素
hash.Count; //計算集合元素個數

List:跟Dictionary一樣是泛型集合,可在編譯階段宣告類型,相當於ArrayList的泛型版本

可用for和foreach遍歷,與ArrayList類似

List<int> list1 = new List<int>(); //定義一個int類型的泛型集合
list.Add(1); //添加一個int

Dictionary:相當於HashTable的泛型版本

Dictionary<string, int> dict = new Dictionary<string, int>(); //定義一個鍵為string,值為int類型的集合。
dict.Add("sk", 18); //添加元素
foreach (string item in dict.Keys)
{
    Console.WriteLine(item);
}
foreach (int item in dict.Values)
{
    Console.WriteLine(item);
}
foreach (KeyValuePair<string, int> item in dict)
{
    Console.WriteLine(item.Key + " " + item.Value);
}

 

【拆箱裝箱】

int a = 123; // boxing
object b = a; // boxing
int c = (int)b; // unboxing

 

【LINQ】

所有LINQ查詢式都包含三個動作:取得資料來源、建立LINQ查詢、執行查詢(透過foreach或ToList來呈現結果)

若想強制執行查詢還可使用Count、Max、Average及First等等傳回單一值

var 查詢變數 = from 範圍變數 in 資料來源
              where 條件子句1 && 條件子句2 //指令and(&&)、或(||)、否(!)
              group 範圍變數 by (條件運算) into 群組變數
              orderby 排序欄位1 ascending, 排序欄位2 descending //第一個升冪第二個降冪
              select 序列元素
var expensiveinStockProducts = from prod in products
                               where prod.UnitsinStock > 0 && prod.UnitPrice > 3.00M
                               select prod;

若為比對金額,該比對金額後面要加"M"

var orders = from cust in customers
             from order in cust.Orders //複合from子句同foreach迴圈效果
             where order.OrderDate >= new DateTime(1998, 1 1) //大於時間1988/1/1的
             select new {cust.CustomerID, order.OrderID, order.OrderDate};

 

【lock(this)、lock(typeof(MyType))、lock("myLock")】

若容器物件由多執行緒叫用,則該容器可傳遞至鎖定,在鎖定之後的同步化程式碼區塊將可存取容器

只要其他執行緒在存取容器前鎖定了同一個容器,就可以安全地同步處理對物件的存取

lock(this)在可公開存取執行個體的情況下,會是問題所在

lock(type0f(MyType))在可公開存取MyType的情況下,會是問題所在

lock("myLock")會是問題所在,因為使用相同字串的處理序中若有任何其他程式碼,將會共用相同的鎖定

最佳做法是定義要鎖定的private物件,或者定義private static物件變數保護所有執行個體通用的資料

Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section
}

thisLock是用來判斷物件是否處於獨佔狀態,必須是參考型別的物件