as效率比強(qiáng)制轉(zhuǎn)型高
強(qiáng)制轉(zhuǎn)型有可能會(huì)拋出異常,而且實(shí)際上調(diào)用的是操作轉(zhuǎn)換符函數(shù); 當(dāng)將基類型轉(zhuǎn)換為子類型時(shí)使用as吮成,其它情況應(yīng)實(shí)現(xiàn)轉(zhuǎn)換操作符,以便進(jìn)行強(qiáng)轉(zhuǎn). 同時(shí)注意as不支持基元類型魔种, 要通過(guò)is判斷來(lái)處理节预。
class SecondType
{
public string Name{set;get;}
public static explicit operator SecondType(FirstType firstType)
{
SecondType st = new SecondType(){Name="From " + firstType.Name};
return st;
}
}
字符串拼接
<font size=2>使用toString()方法來(lái)將當(dāng)前類型值轉(zhuǎn)換為字符串安拟,而不是直接拼接到字符串
// Wrong:
string str = "ab" + 9; // 9會(huì)進(jìn)行裝箱操作会傲,分配多余內(nèi)存
// Correct:
string str = "ab" + 9.ToString();
<font size=2>使用StringBuilder或者Format替代+操作符;+操作符會(huì)創(chuàng)建新字符串對(duì)象</font>
StringBuilder sb = new StringBuilder(str1);
sb.Append(str2);
sb.Append(str3);
string str = sb.ToString();
// or
string str = string.Format("{0}{1}{2}", str1, str2, str3);
避免繼承List<T>
<font size=2>因?yàn)長(zhǎng)ist本身沒有提供太多protected方法淌山,而且同時(shí)自身的方法容易與List的方法混淆泼疑。
最好的方式是,組合List對(duì)象会油,同時(shí)實(shí)現(xiàn)IEnumerable<T>與ICollection<T>接口
</font>
Linq匿名類型
<font size=2>通常游戲中會(huì)定義許多臨時(shí)用的自定義數(shù)據(jù)類型钞啸,久而久之代碼將會(huì)膨脹起來(lái)梭稚。使用匿名類型可以很好的解決這個(gè)問題弧烤,不需要專門定義臨時(shí)類數(shù)據(jù)暇昂。
但是匿名類型不能傳到外部急波,所以轉(zhuǎn)出到外部時(shí)名段,還需要構(gòu)造自定義結(jié)構(gòu)</font>
List<Company> companyList = new List<Company>(){
new Company(){Name="Ubisoft", CompanyID=1},
new Company(){Name="FGOL", CompanyID=2}
};
List<Person> personList = new List<Person>(){
new Person(){Name="WXL", CompanyID=2},
new Person(){Name="LXL", CompanyID=2},
new Person(){Name="HAHA", CompanyID=1}
};
<font color=blue>
var ret = <font color=red>from</font> person <font color=red>in</font> personList <font color=red>join</font> company <font color=red>in</font> companyList
<font color=red>on</font> person.CompanyID <font color=red>equals</font> company.CompanyID
<font color=red>select</font> new {PersonName=person.Name, CompanyName=company.Name};
</font>
// var lst = ret.ToList(); // 此時(shí)可以當(dāng)ICollection一樣來(lái)使用
foreach(var item in ret)
{
Debug.Log(item);
Debug.Log(string.Format("{0}\t{1}", item.PersonName, item.CompanyName));
}
class Company{
public string Name;
public int CompanyID;
}
class Person{
public string Name;
public int CompanyID;
}
Linq延時(shí)求值
<font size=2>在使用Linq表達(dá)式時(shí),返回的只是一個(gè)查詢對(duì)象窃蹋,而只有在遍歷此查詢對(duì)象的時(shí)候才會(huì)真正求值。所以在遍歷前修改值惠奸,會(huì)影響到最后的結(jié)果。而且多個(gè)表達(dá)式之間會(huì)合并操作嗅回,提高效率。</br>
</br>
而如果調(diào)用ToList()方法娃豹,則會(huì)立即計(jì)算,在這之后修改值就不會(huì)有影響躯畴。
</font>
Linq排序
<font size=2>使用Linq排序,就不需要侵入類實(shí)現(xiàn)比較器與迭代器了。其底層還是借助于泛型集合的比較器克滴,迭代器劝赔,索引器來(lái)實(shí)現(xiàn)的。</font>
var ret = from s in companySalary orderby s.BaseSalary select s;
foreach(Salary item in ret)
{
Console.WriteLine(string.Format("Name:{0} \t Salary:{1}", item.Name, item.Salary));
}
Linq減少迭代次數(shù)
// 如果只是取結(jié)果中的一部分?jǐn)?shù)據(jù)观话,則不需要返回所有結(jié)果灵迫,而只是取需要的那一部分狞换。
var ret = (from s in companySalary orderby s.BaseSalary select s).<font color=blue>Take(10)</font>;
序列化
<font size=2>對(duì)類使用序列化時(shí),標(biāo)注那些不需要序列化的字段膨报。 序列化只能針對(duì)字段使用。</font>
[Serializable]
public class MyClass
{
[Noserialized]
public string Temp;
[field:Noserialized] 用于標(biāo)識(shí)event不被序列
public event EventHandler TempChanged;
}