一、 具名引數和選擇性參數
static void Print(string enName, cnName="李飛“, int age=25){...}Print("Prime Li");Print("Prime Li", "李飛");Print("Prime Li", "李飛", 25);Print(enName:"Prime Li");Print(”Prime Li", cnName:"李飛", age:25);
規則:
1. 非選擇性參數必須首先聲明。
2. 非選擇性參數在調用時一定要賦值。
3. 參數是按照聲明的順序。
4. 如果2個簽名相同,非選擇性參數將優先賦值。
二、 泛型的協變與逆變 (out and in)
推薦閱讀腦袋同學的.NET 4.0中的泛型協變和反變
在3.5中,以下代碼通不過編譯。
IList<Elephant> elements = new List<Elephant>();IEnumerable<Animal> animals = elephants;
但是在4.0中,我們可以這樣寫:
定義IBar<out T1, in T2>介面,我們就可以把IBar<string, object>安全的轉換成IBar<object, string>
注意事項:
1. 僅有泛型介面和泛型委派支援對型別參數的可變性,泛型類或泛型方法是不支援的。
2. 實值型別不參與協變或反變,IFoo<int>永遠無法變成IFoo<object>,不管有無聲明out。因為.NET泛型,每個實值型別會產生專屬的封閉構造類型,與參考型別版本不相容。
3. 聲明屬性時要注意,可讀寫的屬性會將類型同時用於參數和傳回值。因此只有唯讀屬性才允許使用out型別參數,唯寫屬效能夠使用in參數。
三、動態語言
1. 動態類型
dynamic myDynamic = "String";Console.Write(myDynamic.GetType().Name); //"System.String"
2. dynamic != var
dynamic是運行時,var是編譯時間。所以dynamic無法智能提示,而var可以。
3. 用dynamic取代反射
dynamic usingDynamic = Activator.CreateInstance(Type.GetType("System.Text.StringBuilder"));usingDynamic.Append("Hello dynamic");Console.Write(usingDynamic.ToString());
4. System.Dynamic.ExpandoObject
ExpandoOjbect是一個可以在運行時動態/刪除屬性、方法和事件的類。
dynamic myExpando = new ExpandoOjbect();myExpando.Value1 = "new value 1";myExpando.Value2 = "new value 2";myExpando.DoSomething = new Action(()=>Console.Write("method call"));Console.Write(myExpando.Value1);
5. System.Dynamic.DynamicObject
class Program{ static void Main(string[] args) { dynamic easierXML = new EasierXML(@"<test><node1>Alpha</node1><node2>Beta</node2></test>"); Console.WriteLine(easierXML.node1); Console.WriteLine(easierXML.node2); Console.ReadKey(); }public class EasierXML : DynamicObject{ private XDocument _xml = new XDocument(); public EasierXML(string Xml) { this._xml = XDocument.Parse(Xml); } public override bool TryGetMember(GetMemberBinder binder,out object result) { string nodeName = binder.Name; result = _xml.Element("test").Element(nodeName).Value; return true; }}}