c#中object、var和dynamic的區(qū)別小結(jié)
原文鏈接:
Difference Between Object and Dynamic Keyword in C#
Difference between var and dynamic in C#
篇一(dynamic與object的區(qū)別)
我們經(jīng)常看到很多C#開(kāi)發(fā)者并不能區(qū)分object與dynamic變量。我最近也嘗試在網(wǎng)上找相關(guān)的教程和文章,不過(guò)還是沒(méi)有找到比較好的解釋。這篇文章將梳理object與dynamic區(qū)別的關(guān)鍵點(diǎn)。
總的來(lái)說(shuō),dynamic與object都不進(jìn)行編譯時(shí)類型檢查(compile-time type checks),只有在運(yùn)行時(shí)才會(huì)對(duì)變量類型進(jìn)行檢查,同時(shí),dynamic和object修飾的變量都能存儲(chǔ)任意數(shù)據(jù)類型。object是C# 1.0引入的,而dynamic是C# 4.0引入的。稍后我會(huì)講一下為什么要引入dynamic。(明明object已經(jīng)存在了,為什么還要引入dynamic?)
下面一些要點(diǎn)解釋了兩者的主要區(qū)別
區(qū)別一
Object: 對(duì)于object,編譯器所給的提示信息較少。它不是編譯器安全的。
例子:
ps: 你在對(duì)object取值/賦值時(shí),每次都必須要顯式轉(zhuǎn)換為自己想要的數(shù)據(jù)類型。
object a = "Rohatash Kumar";
string a1 = a.ToString();
Dynamic: 編譯器不顯示任何提示信息。
用法:
dynamic a = "Rohatash Kumar";
string a1 = a;
區(qū)別二
Object: C# 1.0引入
Dynamic: C# 4.0引入
區(qū)別三
Object: 在使用object時(shí),你必須將object轉(zhuǎn)換為原始數(shù)據(jù)類型才能進(jìn)行預(yù)期操作。正如區(qū)別一所示,下面是錯(cuò)誤示范:
object a = "Rohatash Kumar"; string a1 = a;
因此你必須每次都要進(jìn)行顯式轉(zhuǎn)換
Dynamic: 不需要進(jìn)行顯示轉(zhuǎn)換,但需要知道它內(nèi)部的屬性和方法。(但在點(diǎn)操作的時(shí)候,編譯器不會(huì)提示)
區(qū)別四
Object: 如果此前沒(méi)有轉(zhuǎn)換為合適的數(shù)據(jù)類型(即錯(cuò)誤的類型轉(zhuǎn)換),編譯器會(huì)在運(yùn)行時(shí)拋出錯(cuò)誤。即編譯的時(shí)候不會(huì)報(bào)錯(cuò),而在運(yùn)行(調(diào)用)的時(shí)候就會(huì)報(bào)錯(cuò)。
例子
String a = "Rohatash Kumar"; object a1 = a; int b = (int)a1;
ps:上面的a為string類型;a1為object類型,保存著a的副本。因此不能將a1顯示轉(zhuǎn)換為int類型。
Dynamic: dynamic不會(huì)報(bào)錯(cuò),因?yàn)榫幾g器保存著dynamic變量的所有信息。
dynamic與object總結(jié):
Object 在我們不知道數(shù)據(jù)類型時(shí)很有用。 Dynamic 更多是用在反射,支持動(dòng)態(tài)語(yǔ)言,COM對(duì)象調(diào)用以及獲取LINQ的查詢結(jié)果。
篇二(var與dynamic的區(qū)別)
var是C# 3.0引入的(基于 .NET 3.5),dynamic是C# 4.0。
var聲明的變量都是靜態(tài)類型,dynamic是動(dòng)態(tài)類型。dynamic的引入是為了支持像ruby,python這樣的動(dòng)態(tài)語(yǔ)言。
##### 對(duì)照表
var | dynamic |
---|---|
C# 3.0引入 | C# 4.0引入 |
靜態(tài)類型 – 在編譯的時(shí)候就確定了類型 | 動(dòng)態(tài)類型 – 在運(yùn)行時(shí)才確定變量類型 |
需要 在定義時(shí)完成初始化。 例如: var str="I am a string"; str這個(gè)變量會(huì)被編譯器當(dāng)作string類型。 | 不 需要 在定義時(shí)初始化。 例如,以下代碼沒(méi)有任何問(wèn)題: dynamic str; str="I am a string"; str=2; |
編譯時(shí)捕獲錯(cuò)誤 因?yàn)榫幾g器在編譯的時(shí)候就知道了它的屬性,類型和方法。 | 運(yùn)行時(shí)才會(huì)捕獲錯(cuò)誤 因?yàn)榫幾g器在運(yùn)行的時(shí)候才知道其屬性,類型及方法。 |
Visual Studio會(huì)顯示補(bǔ)全提示(intellisense) 因?yàn)閷?duì)于編譯器而言,變量的類型是確定的/知道的。 | 沒(méi)有智能提示 因?yàn)橹挥羞\(yùn)行時(shí)才能知道其類型,屬性及方法。 |
例如, var obj1;將 拋出編譯錯(cuò)誤 因?yàn)樽兞繘](méi)有被初始化,而編譯器在編譯時(shí)需要根據(jù)它的值推斷出類型。 | 而 dynamic obj1;則編譯成功 |
如, var obj1=1;編譯沒(méi)有問(wèn)題,而再加上下面這句 var obj1=” I am a string”; 就會(huì)報(bào)錯(cuò) 因?yàn)閛bj1的數(shù)據(jù)類型已經(jīng)在第一句賦值時(shí)就確定了,也就是System.Int32(數(shù)字1所對(duì)應(yīng)的數(shù)據(jù)類型) 而第二句把string類型的值賦給Int32自然就違反類型安全了。(一般而言,不同類型不能直接賦值) | 又如, dynamic obj1=1;沒(méi)有問(wèn)題,再加上dynamic obj1=" I am a string";還是沒(méi)有問(wèn)題 因?yàn)榫幾g器首先將obj1指定為Int32類型(運(yùn)行時(shí)指定),在第二句調(diào)用時(shí)又將obj1重新指定為string。代碼完美執(zhí)行,不會(huì)報(bào)錯(cuò)。 |
總結(jié)
到此這篇關(guān)于c#中object、var和dynamic區(qū)別的文章就介紹到這了,更多相關(guān)c#中object、var和dynamic區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)的一款比較美觀的驗(yàn)證碼完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的一款比較美觀的驗(yàn)證碼,以完整實(shí)例形式分析了C#生成驗(yàn)證碼與前端調(diào)用驗(yàn)證碼的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-06-06C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)
這篇文章主要給大家介紹了關(guān)于C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2018-04-04C#用表達(dá)式樹(shù)構(gòu)建動(dòng)態(tài)查詢的方法
這篇文章主要介紹了C#用表達(dá)式樹(shù)構(gòu)建動(dòng)態(tài)查詢的方法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下2020-12-12Visual Studio 未能加載各種Package包的解決方案
打開(kāi)Visual Studio 的時(shí)候,總提示未能加載相應(yīng)的Package包,有時(shí)候還無(wú)法打開(kāi)項(xiàng)目,各種錯(cuò)誤提示,怎么解決呢?下面小編給大家?guī)?lái)了Visual Studio 未能加載各種Package包的解決方案,一起看看吧2016-10-10C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問(wèn)題記錄
Aspose.Cells是一款功能強(qiáng)大的Excel文檔處理和轉(zhuǎn)換控件,開(kāi)發(fā)人員和客戶電腦無(wú)需安裝Microsoft Excel也能在應(yīng)用程序中實(shí)現(xiàn)類似Excel的強(qiáng)大數(shù)據(jù)管理功能,對(duì)C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問(wèn)題記錄感興趣的朋友一起看看吧2022-01-01C# 獲取某個(gè)時(shí)間的0點(diǎn)0分和23點(diǎn)59分59秒
這篇文章主要介紹了C# 獲取某個(gè)時(shí)間的0點(diǎn)0分和23點(diǎn)59分59秒,文中給大家提到了java 獲取某一日期的0點(diǎn)0分0秒和23點(diǎn)59分59秒,需要的朋友可以參考下2019-09-09C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值
這篇文章主要介紹了C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下2014-07-07