最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic

 更新時間:2017年09月06日 15:35:19   作者:DW039  
隨著C#的發(fā)展,該語言內(nèi)容不斷豐富,開發(fā)變得更加方便快捷,C# 的鋒利盡顯無疑。下面通過本文給大家分享C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic,需要的的朋友參考下吧

隨著C#的發(fā)展,該語言內(nèi)容不斷豐富,開發(fā)變得更加方便快捷,C# 的鋒利盡顯無疑。C# 語言從誕生起就是強類型語言,這一性質(zhì)到今天不曾改變,我想以后也不會變。既然是強類型語言,那編寫任一程序均要求滿足下面的基本條件:

1、變量聲明必須指明其類型

2、變量類型明確后,其類型在Runtime亦不能改變

代碼如下:

public class Student
 {
  public string Name { get; set; }
  public int Age { get; set; }
  public string Like { get; set; }
 }
static void Main(string[] args)
{
 int a = 10;
 string s = "abc";
 Student student = new Student();
 //下面出現(xiàn)編譯錯誤,變量類型在聲明后無法再變更
 s = a;
 student = s;
 a = 10.1f;
}

然而,在實際開發(fā)中我們經(jīng)常面臨如下幾種常見問題:

1、在一個較大的程序程序中,只有一處或很少幾處(不超過3處)需要用到 某個或某些類型(如上 Student),其他地方不再需要這些類型。單獨聲明一個Student類型,所需代碼量,可能超過使用該類型時的代碼量,投入產(chǎn)出比不劃算。

2、在一處程序中,只需要某種類型對象的部分屬性或方法參與運算。在這種情況下將該類型對象臨時轉(zhuǎn)換為程序所需的部分屬性和方法的對象,可使程序更加精簡。

3、其他情況........我暫未留意到......歡迎補充........

上面這些 C# 實際開發(fā)中常見問題,在 JavaScript 開發(fā)中有著比較好的解決方案,如下:

//在此處js中需要模擬一個學(xué)生對象
student = {"name":"張三","age":20,"like":"LOL"};
//在此處js中需要模擬一個老師對象
teacher = {"name":"李老師","like":"沒收學(xué)生手機,自己LOL"};
//此處需要將學(xué)生student轉(zhuǎn)換成只有name和age的對象
person = {"name":student.name,"age":student.age};

如果你不熟悉上面的js語法,你可以去百度搜索 “json語法”,告訴你很簡單哦(而且很重要)。

匿名對象(匿名類型)

因此C#在3.0版本中吸收了JavaScript腳本語言的這種語法優(yōu)點,對C#做了相應(yīng)升級使其也支持這種語法形式(C#依然是強類型語言)。示例代碼如下:

static void Main(string[] args)
{
  new {Name="張三",Age=20,Like="LOL"};
}

上面的C#代碼 通過new關(guān)鍵字告訴編譯器要創(chuàng)建一個對象,該對象具有Name,Age,Like三個屬性,=后為屬性對應(yīng)的值。如此我們避開了“創(chuàng)建一個對象首先要有該對象類型的約束”,因此在開發(fā)過程中對于使用較少的類型我們無需再創(chuàng)建單獨的類了,上面提到的問題1被解決。

現(xiàn)在創(chuàng)建出來的對象沒指定具體類型,因此稱為匿名對象。

Var登場

現(xiàn)在要使用匿名對象,則需要使用變量引用它。雖然我們在創(chuàng)建時沒有指定對象的類型,但編譯器會在編譯過程中幫我們創(chuàng)建一個具有相關(guān)屬性和方法的類型。此時編譯出的類型名稱是隨機生成的,因此變量類型無法確定。示例如下:

static void Main(string[] args)
{
 //XXX為類型聲明
 //x為引用變量 
  XXX x = new {Name="張三",Age=20,Like="LOL"};
}

雖然我們不知道編譯器生成的類型名稱,但我們可 讓編譯器自己根據(jù)編譯的結(jié)果來推斷變量類型。此時var關(guān)鍵字便發(fā)揮作用了:

static void Main(string[] args)
{
  var x = new {Name="張三",Age=20,Like="LOL"};
}

var 關(guān)鍵字說明 x 的類型由賦于的值來決定(推定),并能根據(jù)編譯器推定給出智能提示,如下圖:

var使用注意事項:

1、var 僅能聲明方法內(nèi)的局部變量

2、var 聲明的變量在被賦值后類型即確定下了,后續(xù)程序中不能在賦其他類型的值

3、var x = new object() 沒有意義,不要寫這樣的代碼...............

 現(xiàn)在有匿名對象和var推斷類型的支持,我們就能處理上面提到的問題2。示例代碼如下:

 static void Main(string[] args)
  {
   var x = new { Name = "張三", Age = 20, Like = "LOL" };
   var s = new { Name = x.Name, Age = x.Age }; 
  }

上面僅為示例,如果你熟悉Linq或Entity Framework,那問題2對應(yīng)的用法將是鋪天蓋地的.......

動態(tài)類型 dynamic 出場

對于匿名類型的使用一般局限于方法的局部,可理解為:隨用隨定義,用完就消失。有如下情況應(yīng)該怎么辦?    

 static void Main(string[] args)
  {
   var x = GetObject(); 
  }

  private static XXX GetObject()
  {
   return new { Name = "張三", Age = 20, Like = "LOL" };
  }

通過GetObject方法返回一個匿名對象,所以方法返回值 類型名稱無法確定,此處暫時用XXX代替。在這種情況下返回的類型不確定,可以使用 dynamic 來指明。如下:

 static void Main(string[] args)
  {
   var x = GetObject(); 
   Console.WriteLine(x.Name);
  }
  private static dynamic GetObject()
  {
   return new { Name = "張三", Age = 20, Like = "LOL" };
  }

此時方法不會出現(xiàn)語法錯誤,程序可以成功編譯并執(zhí)行。那么 dynamic 到底做了什么,可以使上面的程序成功編譯呢?

dynamic的作用:

1、dynamic 表示動態(tài)類型,動態(tài)類型的含義就是 程序編寫、編譯階段 類型不確定,在Runtime時再通過反射機制確定相關(guān)對象的屬性或方法。因此編寫階段不會進行語法檢測。

2、dynamic 可用來聲明 字段、屬性、方法參數(shù)、方法返回值

3、dynamic 不支持智能提示,因為你寫代碼時 dynamic  是什么沒法知曉(反射)

dynamic 聲明的變量,可理解為 object 類型變量。所以給dynamic變量賦任何類型值都正確,但在使用變量來取得某個屬性值或調(diào)用某方法時(此時程序肯定處于Runtime狀態(tài)),CLR會檢查(反射)所調(diào)用的屬性或方法是否存在,不存在報運行時異常。

dynamic在 Asp.net Mvc web開發(fā)中處處使用,雖然看上去很復(fù)雜,本質(zhì)就上面所說內(nèi)容。

說明:

var 和 dynamic 看似功能類似,但它們是不同的:


var
dynamic
 聲明字段  ×  √
 局部變量  √  √
 方法參數(shù)類型  ×  √
 方法返回值類型  ×  √

總結(jié)

以上所述是小編給大家介紹的C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C#無損高質(zhì)量壓縮圖片代碼

    C#無損高質(zhì)量壓縮圖片代碼

    這篇文章主要為大家詳細介紹了C#無損高質(zhì)量壓縮圖片代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • c# 共享狀態(tài)的文件讀寫實現(xiàn)代碼

    c# 共享狀態(tài)的文件讀寫實現(xiàn)代碼

    開發(fā)中有時會遇到要對文件進行共享狀態(tài)的讀寫操作,代碼如下,需要的朋友可以參考下
    2012-06-06
  • C#簡單實現(xiàn)在網(wǎng)頁上發(fā)郵件的案例

    C#簡單實現(xiàn)在網(wǎng)頁上發(fā)郵件的案例

    本文分享一個C#利用SMTP發(fā)送郵件的案例,提供了前后臺代碼,方便大家學(xué)習(xí)。
    2016-03-03
  • C#前端驗證和后臺驗證代碼實例

    C#前端驗證和后臺驗證代碼實例

    這篇文章主要介紹了C#前端驗證和后臺驗證代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • C#實現(xiàn)定時任務(wù)Task Scheduler的示例代碼

    C#實現(xiàn)定時任務(wù)Task Scheduler的示例代碼

    這篇文章主要為大家詳細介紹了C#實現(xiàn)定時任務(wù)Task Scheduler的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#提取PDF表單數(shù)據(jù)的實現(xiàn)流程

    C#提取PDF表單數(shù)據(jù)的實現(xiàn)流程

    PDF表單是一種常見的數(shù)據(jù)收集工具,廣泛應(yīng)用于調(diào)查問卷、業(yè)務(wù)合同等場景,憑借出色的跨平臺兼容性和標(biāo)準(zhǔn)化特點,PDF表單在各行各業(yè)中得到了廣泛應(yīng)用,本文將探討如何使用C# 實現(xiàn)自動化PDF表單數(shù)據(jù)提取流程,需要的朋友可以參考下
    2025-01-01
  • C#中的線程Threads與任務(wù)Tasks詳解(最新整理)

    C#中的線程Threads與任務(wù)Tasks詳解(最新整理)

    C#開發(fā)中推薦使用Task而非Thread,由于Task更高效,提供更簡單的接口,并且由.NET運行時管理線程,減少開發(fā)者負擔(dān),Task適合異步操作和返回值處理,而Thread則適用于需要低級控制和實時系統(tǒng),這篇文章介紹C#中的線程Threads與任務(wù)Tasks,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • C#操作注冊表之RegistryKey類

    C#操作注冊表之RegistryKey類

    這篇文章介紹了C#操作注冊表之RegistryKey類,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#添加Windows服務(wù) 定時任務(wù)

    C#添加Windows服務(wù) 定時任務(wù)

    這篇文章主要為大家詳細介紹了C#添加Windows服務(wù),定時任務(wù)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 一文詳解C#訪問修飾符的終極指南

    一文詳解C#訪問修飾符的終極指南

    這篇文章主要為大家詳細介紹了C#中訪問修飾符的相關(guān)使用方法,包括public,private,protected,等,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-03-03

最新評論

仁寿县| 石家庄市| 崇信县| 双峰县| 灌南县| 屯留县| 武穴市| 大洼县| 沂南县| 德钦县| 麟游县| 峡江县| 永善县| 民丰县| 马边| 延边| 施甸县| 杭锦后旗| 禄丰县| 河曲县| 财经| 望都县| 门源| 平昌县| 丹江口市| 余干县| 长泰县| 宁波市| 沽源县| 六盘水市| 武宁县| 额济纳旗| 晋中市| 盐源县| 洪洞县| 佛冈县| 常熟市| 綦江县| 阜新| 繁昌县| 岚皋县|