MVC 之var與dynamic

来源:https://www.cnblogs.com/Liyuting/archive/2018/03/02/8491866.html
-Advertisement-
Play Games

如果你用MVC寫過程式,那麼你應該知道ViewBag這個用於前後臺的數據傳遞工具,那麼你是否對ViewBag的用法感到過疑惑呢? 我們知道,在使用對象屬性的時候要先申明(即這個對象的類中已經定義了這個屬性)才能使用(此時VS的自動提示能彈出此類的所有屬性),然而使用ViewBag時你會發現 View ...


如果你用MVC寫過程式,那麼你應該知道ViewBag這個用於前後臺的數據傳遞工具,那麼你是否對ViewBag的用法感到過疑惑呢?

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

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

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

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

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

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

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,因為可以將查詢結果的類型顯示的申明為IEnumerable<string>
string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
var wordQuery = from word in words
                where 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.">表達式中必須使用 var,因為結果是一個匿名類型集合,而該類型的名稱只有編譯器本身可以訪問
var custQuery = from cust in customers
                where cust.City == "Phoenix"
                select new { cust.Name, cust.Phone };

//foreach iteration variable item must also be implicitly typed.">foreach 迭代變數 item 也必須轉換為隱式類型,因為custQuery為匿名集合
foreach (var item in custQuery)
{
    Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}

3.dynamic

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

在大多數情況下,dynamic 類型與 object 類型的行為是一樣的。 但是,不會用編譯器對包含 dynamic 類型表達式的操作進行解析或類型檢查。 編譯器將有關該操作信息打包在一起,並且該信息以後用於計算運行時操作。 在此過程中,類型 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());
    }
}

//輸出結果
System.Int32
System.Int32

4.dynamic一些常見的用法

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

class ExampleClass
{
    // 欄位
    static dynamic field;

    // 屬性
    dynamic prop { get; set; }

    //返回值與參數
    public dynamic exampleMethod(dynamic d)
    {
        dynamic local = "Local variable";
        int two = 2;

        if (d is int)
        {
            return local;
        }
        else
        {
            return two;
        }
    }
}

(2)在顯式類型轉換中,作為轉換的目標類型。

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)在以類型充當值(如 is 運算符或 as 運算符右側)或者作為 typeof 的參數成為構造類型的一部分的任何上下文中。

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類型的屬性,所以編譯器不會對它進行檢查,所以我們可以自定義屬性。我們也可以通過ExpandoObject() 這個類來實現我們自己的ViewBab,看下麵示例:

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

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

 

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目的 因為某些原因需要將存放在 Google Chrome 內的書簽導出到本地,所幸 Google Chrome 提供了導出書簽的功能。 分析 首先在 Google Chrome 瀏覽器當中輸入 來到書簽管理頁面,找到最右側的三個點,選擇導出書簽,導出的文件是一個 HTML 文件,裡面包含了所有書簽 ...
  • Power Shell管理Office參考http://www.mamicode.com/info-detail-494553.html C#調用Power Shell 參考 https://www.cnblogs.com/chenkai/archive/2010/11/09/1872471.htm ...
  • 前面文章介紹了ASP.NET MVC中的模型綁定和驗證功能,本著ASP.NET MVC沒有魔法的精神,本章內容將從代碼的角度對ASP.NET MVC如何完成模型的綁定和驗證進行分析,已瞭解其原理。 本文的主要內容有: ● ModelBinder ● ValuePrivoder ● ModelMeta ...
  • 利用vs創建一個MVC項目後,一般的預設啟動頁是根目錄下-->Controllers-->HomeController-->Index這個方法對應的頁面。 我先說下創建Areas的流程: 但是我們的controller一般都會建立很多,這樣我們就會想建個文件夾按照業務或者其他的分類方式把這麼多文件放 ...
  • 經常用到的一個知識點,每次用到就去百度一下,今天又用到了(又跑去擺渡了),為了防止用完就忘,用到就搜,今天自己記錄一下。 如何根據分隔符(比如逗號),將List<string>泛型集合合併成一個string字元串?以往的開發中,都是使用迴圈的方式來拼接成字元串,不僅要寫更多的代碼不說,還會消耗更多的 ...
  • 首先聲明,本文寫的有點粗糙,只讓你瞭解什麼是協變和逆變,沒有深入研究,根據這些年的工作經驗,發現我們在開發過程中,很少會自己去寫逆變和協變,因為自從net 4.0 (Framework 3.0) 以後,.net 就為我們提供了 定義好的逆變與協變。我們只要會使用就可以。協變和逆變都是在泛型中使用的。 ...
  • 一,什麼是NPOI 該項目是位於http://poi.apache.org/的POI Java項目的.NET版本。POI是一個開源項目,可以幫助您讀取/寫入xls,doc,ppt文件。它有著廣泛的應用。 二,NPOI的優勢 一個。它完全免費使用 灣 涵蓋Excel的大部分功能(單元格樣式,數據格式, ...
  • 從2012年4月份工作至今,做過大小各種項目差不多有20來個,最近有認識的好友, 轉行學軟體開發,我向他推薦了C#. 藉此機會, 我也好好從頭整理一下C#. 工欲善其事,必先利其器. VS IDE 宇宙第一, 這個毫無疑問. 然後VS裡面可以附帶一些小插件, 我覺得這樣能更好的輔助我們開發. 下麵是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...