日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MVC 之var与dynamic

發(fā)布時間:2023/12/2 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC 之var与dynamic 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果你用MVC寫過程序,那么你應(yīng)該知道ViewBag這個用于前后臺的數(shù)據(jù)傳遞工具,那么你是否對ViewBag的用法感到過疑惑呢?

ViewBag.Mode1l=new object(); ViewBag.Model2=new object(); ViewBag.Model3=new object(); ......

 我們知道,在使用對象屬性的時候要先申明(即這個對象的類中已經(jīng)定義了這個屬性)才能使用(此時VS的自動提示能彈出此類的所有屬性),然而使用ViewBag時你會發(fā)現(xiàn)?ViewBab.?之后不會彈出任何屬性(除非前面已經(jīng)添加了屬性),而且我們可以自己隨便寫一個屬性,卻可以正確運行。而這都是歸功于dynamic這個屬性。

1.在講dynamic之前,先來回顧一下var這個類型。

  從 Visual C# 3.0 開始,在方法范圍中聲明的變量可以具有隱式類型?var。?隱式類型的本地變量是強類型變量(就好像您已經(jīng)聲明該類型一樣),但由編譯器確定類型。?下面的兩個?i 聲明在功能上是等效的:

var i = 10; // implicitly typed(隱式申明) int i = 10; //explicitly typed(顯示申明)

var這個類型是通過編譯器確定的(即在編譯時,編譯器會根據(jù)這個變量的值或引用的對象類型來決定這個變量的類型),但要注意一旦這個變量的類型確定了之后就不可在更改。

var i = 1; //i為int型 , 等價于 int i = 1; i = 1.0//報錯,1.0為double型

 注意,var型變量在申明時必須初始化,如下:

var i = 1; //正確var i;  i = 1; //錯誤

2.var用法舉例:

// 允許但不需要使用var,因為可以將查詢結(jié)果的類型顯示的申明為IEnumerable<string> string[] words = { "apple", "strawberry", "grape", "peach", "banana" }; var wordQuery = from word in wordswhere word[0] == 'g'select word;// 因為元素類型為string類型,不是匿名類型,所以var是非必需的 foreach (string s in wordQuery) {Console.WriteLine(s); }//var must be used because the result is a collection of anonymous types, and the name of that type is not accessible except to the compiler itself.">表達(dá)式中必須使用 var,因為結(jié)果是一個匿名類型集合,而該類型的名稱只有編譯器本身可以訪問 var custQuery = from cust in customerswhere cust.City == "Phoenix"select new { cust.Name, cust.Phone };//foreach iteration variable item must also be implicitly typed.">foreach 迭代變量 item 也必須轉(zhuǎn)換為隱式類型,因為custQuery為匿名集合 foreach (var item in custQuery) {Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone); }

3.dynamic

  在通過?dynamic 類型實現(xiàn)的操作中,該類型的作用是繞過編譯時類型檢查,?改為在運行時解析這些操作。?dynamic 類型簡化了對 COM API(例如 Office Automation API)、動態(tài) API(例如 IronPython 庫)和 HTML 文檔對象模型 (DOM) 的訪問。

在大多數(shù)情況下,dynamic 類型與?object 類型的行為是一樣的。?但是,不會用編譯器對包含?dynamic 類型表達(dá)式的操作進(jìn)行解析或類型檢查。?編譯器將有關(guān)該操作信息打包在一起,并且該信息以后用于計算運行時操作。?在此過程中,類型?dynamic 的變量會編譯到類型?object 的變量中。?因此,類型?dynamic 只在編譯時存在,在運行時則不存在。

class Program {static void Main(string[] args){dynamic dyn = 1;object obj = 1;dyn = dyn 3; //編譯可以通過,dynamic可以繞過編譯器obj = obj 3; //報錯,編譯無法通過 System.Console.WriteLine(dyn.GetType());System.Console.WriteLine(obj.GetType());} }//輸出結(jié)果 System.Int32 System.Int32

4.dynamic一些常見的用法

  (1)在聲明中,作為屬性、字段、索引器、參數(shù)、返回值或類型約束的類型。

class ExampleClass {// 字段static dynamic field;// 屬性dynamic prop { get; set; }//返回值與參數(shù)public dynamic exampleMethod(dynamic d){dynamic local = "Local variable";int two = 2;if (d is int){return local;}else{return two;}} }

(2)在顯式類型轉(zhuǎn)換中,作為轉(zhuǎn)換的目標(biāo)類型。

static void convertToDynamic() {dynamic d;int i = 20;d = (dynamic)i;Console.WriteLine(d);string s = "Example string.";d = (dynamic)s;Console.WriteLine(d);DateTime dt = DateTime.Today;d = (dynamic)dt;Console.WriteLine(d);} // Results: // 20 // Example string. // 2/17/2009 9:12:00 AM

(3)在以類型充當(dāng)值(如?is 運算符或?as 運算符右側(cè))或者作為?typeof 的參數(shù)成為構(gòu)造類型的一部分的任何上下文中。

int i = 8; dynamic d;if (someVar is dynamic) { }d = i as dynamic;Console.WriteLine(typeof(List<dynamic>)); //Console.WriteLine(typeof(dynamic));  //編譯錯誤

5.dynamic與ViewBab

  ViewBab是一個dynamic類型的屬性,所以編譯器不會對它進(jìn)行檢查,所以我們可以自定義屬性。我們也可以通過ExpandoObject() 這個類來實現(xiàn)我們自己的ViewBab,看下面示例:

public class Program {public static void Main(string[] args){dynamic model = new ExpandoObject(); //在運行時,model 會轉(zhuǎn)化為 ExpandoObject() 的一個實例model.Index = 0; //ExpandoObject() 有一個事件 PropertyChanged,運行時動態(tài)觸發(fā)這個事件,model.Number = 0; //然后將Index與Number這個兩個屬性添加到類中 Console.WriteLine(model.Index);Console.WriteLine(model.Number);Console.ReadKey();} }

也許你會覺得dynamic用到的不多,所以不必深入理解,但等到你真正遇到它時,將會吃大虧。正如上面講的那樣,它在COM API 、 動態(tài)API 、HTML對象模型的操作上有重要作用,通過它,可以簡化操作,但同時它也容易讓人迷糊(它所指向的究竟是什么樣的對象類型),因為簡化通常意味著隱藏,它將復(fù)雜的后臺實現(xiàn)封裝并開放見簡單的接口給我們使用,這樣簡化了我們的操作,卻然我們更容易迷惑,我們不知道它為什么要這樣做,只知道可以這樣做,使得我們在很多問題上無法深入挖掘。在網(wǎng)站開發(fā)中,深入理解dynamic,有利于我們深入到框架內(nèi)部去,對我們學(xué)習(xí).Net架構(gòu)是非常有幫助的。

?

原文鏈接:https://www.cnblogs.com/SilentCode/p/4920598.html

?


更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com

總結(jié)

以上是生活随笔為你收集整理的MVC 之var与dynamic的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。