欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#中object、var和dynamic的區(qū)別小結(jié)

 更新時間:2020年09月30日 09:30:35   作者:楊帆  
這篇文章主要給大家介紹了關(guān)于c#中object、var和dynamic的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

原文鏈接:

Difference Between Object and Dynamic Keyword in C#

Difference between var and dynamic in C#

篇一(dynamic與object的區(qū)別)

我們經(jīng)??吹胶芏郈#開發(fā)者并不能區(qū)分object與dynamic變量。我最近也嘗試在網(wǎng)上找相關(guān)的教程和文章,不過還是沒有找到比較好的解釋。這篇文章將梳理object與dynamic區(qū)別的關(guān)鍵點。

總的來說,dynamic與object都不進(jìn)行編譯時類型檢查(compile-time type checks),只有在運(yùn)行時才會對變量類型進(jìn)行檢查,同時,dynamic和object修飾的變量都能存儲任意數(shù)據(jù)類型。object是C# 1.0引入的,而dynamic是C# 4.0引入的。稍后我會講一下為什么要引入dynamic。(明明object已經(jīng)存在了,為什么還要引入dynamic?)

下面一些要點解釋了兩者的主要區(qū)別

區(qū)別一

Object: 對于object,編譯器所給的提示信息較少。它不是編譯器安全的。

例子:

ps: 你在對object取值/賦值時,每次都必須要顯式轉(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時,你必須將object轉(zhuǎn)換為原始數(shù)據(jù)類型才能進(jìn)行預(yù)期操作。正如區(qū)別一所示,下面是錯誤示范:

object a = "Rohatash Kumar";
string a1 = a;

因此你必須每次都要進(jìn)行顯式轉(zhuǎn)換

Dynamic: 不需要進(jìn)行顯示轉(zhuǎn)換,但需要知道它內(nèi)部的屬性和方法。(但在點操作的時候,編譯器不會提示)

區(qū)別四

Object: 如果此前沒有轉(zhuǎn)換為合適的數(shù)據(jù)類型(即錯誤的類型轉(zhuǎn)換),編譯器會在運(yùn)行時拋出錯誤。即編譯的時候不會報錯,而在運(yùn)行(調(diào)用)的時候就會報錯。

例子

String a = "Rohatash Kumar";
object a1 = a;
int b = (int)a1;

ps:上面的a為string類型;a1為object類型,保存著a的副本。因此不能將a1顯示轉(zhuǎn)換為int類型。

Dynamic: dynamic不會報錯,因為編譯器保存著dynamic變量的所有信息。

dynamic與object總結(jié):

Object 在我們不知道數(shù)據(jù)類型時很有用。 Dynamic 更多是用在反射,支持動態(tài)語言,COM對象調(diào)用以及獲取LINQ的查詢結(jié)果。

篇二(var與dynamic的區(qū)別)

var是C# 3.0引入的(基于 .NET 3.5),dynamic是C# 4.0。

var聲明的變量都是靜態(tài)類型,dynamic是動態(tài)類型。dynamic的引入是為了支持像ruby,python這樣的動態(tài)語言。

##### 對照表

var dynamic
C# 3.0引入 C# 4.0引入
靜態(tài)類型 – 在編譯的時候就確定了類型 動態(tài)類型 – 在運(yùn)行時才確定變量類型
需要 在定義時完成初始化。 例如: var str="I am a string"; str這個變量會被編譯器當(dāng)作string類型。 不 需要 在定義時初始化。 例如,以下代碼沒有任何問題: dynamic str; str="I am a string"; str=2;
編譯時捕獲錯誤 因為編譯器在編譯的時候就知道了它的屬性,類型和方法。 運(yùn)行時才會捕獲錯誤 因為編譯器在運(yùn)行的時候才知道其屬性,類型及方法。
Visual Studio會顯示補(bǔ)全提示(intellisense) 因為對于編譯器而言,變量的類型是確定的/知道的。 沒有智能提示 因為只有運(yùn)行時才能知道其類型,屬性及方法。
例如, var obj1;將 拋出編譯錯誤 因為變量沒有被初始化,而編譯器在編譯時需要根據(jù)它的值推斷出類型。 而 dynamic obj1;則編譯成功
如, var obj1=1;編譯沒有問題,而再加上下面這句 var obj1=” I am a string”; 就會報錯 因為obj1的數(shù)據(jù)類型已經(jīng)在第一句賦值時就確定了,也就是System.Int32(數(shù)字1所對應(yīng)的數(shù)據(jù)類型) 而第二句把string類型的值賦給Int32自然就違反類型安全了。(一般而言,不同類型不能直接賦值) 又如, dynamic obj1=1;沒有問題,再加上dynamic obj1=" I am a string";還是沒有問題 因為編譯器首先將obj1指定為Int32類型(運(yùn)行時指定),在第二句調(diào)用時又將obj1重新指定為string。代碼完美執(zhí)行,不會報錯。

總結(jié)

到此這篇關(guān)于c#中object、var和dynamic區(qū)別的文章就介紹到這了,更多相關(guān)c#中object、var和dynamic區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#生成隨機(jī)數(shù)實例

    C#生成隨機(jī)數(shù)實例

    這篇文章主要介紹了C#生成隨機(jī)數(shù)的方法,實例分析了隨機(jī)數(shù)的生成原理與使用技巧,需要的朋友可以參考下
    2015-01-01
  • C#實現(xiàn)的一款比較美觀的驗證碼完整實例

    C#實現(xiàn)的一款比較美觀的驗證碼完整實例

    這篇文章主要介紹了C#實現(xiàn)的一款比較美觀的驗證碼,以完整實例形式分析了C#生成驗證碼與前端調(diào)用驗證碼的實現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)

    C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)

    這篇文章主要給大家介紹了關(guān)于C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2018-04-04
  • C#使用log4net的3種調(diào)用方法

    C#使用log4net的3種調(diào)用方法

    log4net是一個用于記錄日志的開源框架,它是C#中最常用的日志記錄工具之一,本文給大家介紹了C#使用log4net的3種調(diào)用方法,通過圖文和代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C#用表達(dá)式樹構(gòu)建動態(tài)查詢的方法

    C#用表達(dá)式樹構(gòu)建動態(tài)查詢的方法

    這篇文章主要介紹了C#用表達(dá)式樹構(gòu)建動態(tài)查詢的方法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-12-12
  • Visual Studio 未能加載各種Package包的解決方案

    Visual Studio 未能加載各種Package包的解決方案

    打開Visual Studio 的時候,總提示未能加載相應(yīng)的Package包,有時候還無法打開項目,各種錯誤提示,怎么解決呢?下面小編給大家?guī)砹薞isual Studio 未能加載各種Package包的解決方案,一起看看吧
    2016-10-10
  • C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄

    C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄

    Aspose.Cells是一款功能強(qiáng)大的Excel文檔處理和轉(zhuǎn)換控件,開發(fā)人員和客戶電腦無需安裝Microsoft Excel也能在應(yīng)用程序中實現(xiàn)類似Excel的強(qiáng)大數(shù)據(jù)管理功能,對C#?使用Aspose.Cells?導(dǎo)出Excel的步驟及問題記錄感興趣的朋友一起看看吧
    2022-01-01
  • C#線程池用法詳細(xì)介紹

    C#線程池用法詳細(xì)介紹

    在C#編程語言中,使用線程池可以并行地處理工作,當(dāng)強(qiáng)制線程和更新進(jìn)度條時,會使用內(nèi)建架構(gòu)的ThreadPool類,為批處理使用多核結(jié)構(gòu),這里我們來看在C#編程語言中一些關(guān)于來自System.Threading的ThreadPool的用法的例子
    2013-11-11
  • C# 獲取某個時間的0點0分和23點59分59秒

    C# 獲取某個時間的0點0分和23點59分59秒

    這篇文章主要介紹了C# 獲取某個時間的0點0分和23點59分59秒,文中給大家提到了java 獲取某一日期的0點0分0秒和23點59分59秒,需要的朋友可以參考下
    2019-09-09
  • C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值

    C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值

    這篇文章主要介紹了C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下
    2014-07-07

最新評論