當前位置: 妍妍網 > 碼農

C# dynamic 型別用法舉例

2024-02-08碼農

dynamic型別允許編寫忽略編譯期間的型別檢查的程式碼。 編譯器假定,給d ynamic型別的物件定義的任操作都是有效的。 如果該操作無效,則在程式碼執行之前不會檢測該錯誤,如下面的範例所示:

這個範例沒有編譯,因為它呼叫了staticPerson.GetFullName方法。因為Person 物件上的方法不接受兩個參數,所以編譯器會提示出錯。如果註釋掉該行程式碼,這個範例就會編譯。如果執行它,就會發生一個執行錯誤。所丟擲的異常是RuntimeBinderException 異常。RuntimeBinder物件會在執行時判斷該呼叫,確定Person類是否支持被呼叫的方法。

與 var 關鍵字不同,定義為dynamic的物件可以在執行期間改變其型別。註意在使用var關鍵字時,物件型別的確定會證遲。型別一旦確定,就不能改變。動態物件的型別可以改變,而且可以改變影次,這不同於把物件的型別事轉換為另一種型別。在強制轉換物件的型別時,是用另一種相容的類聚們建一個新物件。如,不能把int強制轉換為Penon物件。在下面的範例中,如果物件是動態物件,就可以把它從int變成Persor型別:

staticvoidMain(string[] args) {//var staticperson = new Person();//dynamic dynamicPerson = new Person();//staticperson.GetFullName("John", "Smith");//dynamicPerson.GetFullName("Jchn", "Smith");dynamic dyn; dyn = 100; Console.WriteLine(dyn.GetType()); Console.WriteLine(dyn); dyn = "This is a string"; Console.WriteLine(dyn.GetType()); Console.WriteLine(dyn); dyn = new Person() { FirstName = "Bugs", LastName = "Bunny" }; Console.WriteLine(dyn.GetType()); Console.WriteLine($"{dyn.FirstName}{dyn.LastName}"); Console.ReadKey(); }

執行這段程式碼可以看出,dyn物件的型別實際上從System.Int32變成System.String.再變成Person。如果 dyn聲明為int 或string,這段程式碼就不會編譯。

註意:對於dynamic 型別有兩個限制。動態物件不支持擴充套件方法,匿名函式(lambda運算式)也不能用作動態方法呼叫的參數,因此LINQ不能用於動態物件,大多數LINQ呼叫大都是擴充套件方法,而lambda運算式用作這些擴充套件方法的參數.

技術群: 添加小編微信並備註進群

小編微信:mm1552923

公眾號:dotNet編程大全