.net 4.0 學習筆記(1)—— C#4.0語言和動態運行時的改進

來源:互聯網
上載者:User

一、 具名引數和選擇性參數

 

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;    }}}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.