激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - C# - 詳解C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic

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

2022-01-21 13:50DW039 C#

隨著C#的發(fā)展,該語言內容不斷豐富,開發(fā)變得更加方便快捷,C# 的鋒利盡顯無疑。下面通過本文給大家分享C# 匿名對象(匿名類型)、var、動態(tài)類型 dynamic,需要的的朋友參考下吧

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

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

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

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
 //下面出現編譯錯誤,變量類型在聲明后無法再變更
 s = a;
 student = s;
 a = 10.1f;
}

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

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

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

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

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

?
1
2
3
4
5
6
//在此處js中需要模擬一個學生對象
student = {"name":"張三","age":20,"like":"lol"};
//在此處js中需要模擬一個老師對象
teacher = {"name":"李老師","like":"沒收學生手機,自己lol"};
//此處需要將學生student轉換成只有name和age的對象
person = {"name":student.name,"age":student.age};

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

匿名對象(匿名類型)

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

?
1
2
3
4
static void main(string[] args)
{
  new {name="張三",age=20,like="lol"};
}

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

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

var登場

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

?
1
2
3
4
5
6
static void main(string[] args)
{
 //xxx為類型聲明
 //x為引用變量
  xxx x = new {name="張三",age=20,like="lol"};
}

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

?
1
2
3
4
static void main(string[] args)
{
  var x = new {name="張三",age=20,like="lol"};
}

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

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

var使用注意事項:

1、var 僅能聲明方法內的局部變量

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

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

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

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

?
1
2
3
4
5
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對應的用法將是鋪天蓋地的.......

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

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

?
1
2
3
4
5
6
7
8
9
static void main(string[] args)
 {
  var x = getobject();
 }
 
 private static xxx getobject()
 {
  return new { name = "張三", age = 20, like = "lol" };
 }

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

?
1
2
3
4
5
6
7
8
9
static void main(string[] args)
 {
  var x = getobject();
  console.writeline(x.name);
 }
 private static dynamic getobject()
 {
  return new { name = "張三", age = 20, like = "lol" };
 }

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

dynamic的作用:

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

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

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

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

dynamic在 asp.net mvc web開發(fā)中處處使用,雖然看上去很復雜,本質就上面所說內容。

說明:

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

 


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

 

總結

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

原文鏈接:http://www.cnblogs.com/dw039/p/7472119.html

延伸 · 閱讀

精彩推薦
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#WPF 自定義雷達圖開發(fā)實例教程

    WPF 自定義雷達圖開發(fā)實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發(fā)實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
666
主站蜘蛛池模板: 欧美一级电影在线观看 | 吾色视频 | av免费av| 欧美一级毛片大片免费播放 | 久久99精品久久久久久园产越南 | 久久久久久久久免费 | 成人在线免费小视频 | 亚洲成人免费视频在线 | 欧美精品一区二区三区四区 | 性高潮一级片 | 精品国产一区二区三区四区阿崩 | 日日草视频 | 国产成人在线看 | 青草视频在线观看视频 | 少妇一级淫片免费放正片 | 久久精品国产亚洲aa级女大片 | 亚洲草逼视频 | 久草手机视频在线观看 | 成人一级黄色片 | 叶子楣成人爽a毛片免费啪啪 | 国产亲子伦在线观看 | 欧美一二区视频 | 91精彩在线| 日本在线不卡一区二区 | 日韩美香港a一级毛片 | 亚洲小视频在线 | 久久久久亚洲视频 | 国产精品91在线 | 国产一级二级视频 | 亚洲网站免费 | av亚洲在线观看 | 涩涩天堂| 色精品国产| 国产精品亚洲综合一区二区三区 | 久久色播 | 美女在线观看视频一区二区 | 免费一级欧美 | 一级片999 | 一边吃奶一边插下面 | 91在线视频网址 | 色妞色视频一区二区三区四区 |