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

淺析C# Dynamic關(guān)鍵字

 更新時間:2020年08月05日 10:09:43   作者:每天進步多一點  
這篇文章主要介紹了C# Dynamic關(guān)鍵字的相關(guān)資料,文中講解非常細致,對大家學習C# Dynamic關(guān)鍵字有所幫助,感興趣的朋友可以了解下

dynamic關(guān)鍵字和動態(tài)語言運行時(DLR)是.Net 4.0中新增的功能。

什么是"動態(tài)"?

  編程語言有時可以劃分為靜態(tài)類型化語言和動態(tài)類型化語言。C#和Java經(jīng)常被認為是靜態(tài)化類型的語言,而Python、Ruby和JavaScript是動態(tài)類型語言。

  一般而言,動態(tài)語言在編譯時不會對類型進行檢查,而是在運行時識別對象的類型。這種方法有利有弊:代碼編寫起來更快、更容易,但無法獲取編譯器錯誤,只能通過單元測試和其他方法來確保應(yīng)用正常運行。

  C#最初是作為純靜態(tài)語言創(chuàng)建的,但是C#4添加了一些動態(tài)元素,用于改進與動態(tài)語言和框架之間的互操作性。C# 團隊考慮了多種設(shè)計選項,但最終確定添加一個新關(guān)鍵字來支持這些功能:dynamic。

  dynamic關(guān)鍵字可充當C#類型系統(tǒng)中的靜態(tài)類型聲明。這樣,C#就獲得了動態(tài)功能,同時仍然作為靜態(tài)類型化語言而存在。

  由于編譯時不會去檢查類型,所以導(dǎo)致IDE的IntellSense失效。

dynamic、Object還是Var?

  那么,dynamic、Object和var之間的實際區(qū)別是什么?何時使用它們?

  先說說var,經(jīng)常有人會拿dynamic和var進行比較。實際上,var和dynamic完全是兩個概念,根本不應(yīng)該放在一起做比較。

  var實際上編譯器拋給我們的語法糖,一旦被編譯,編譯器就會自動匹配var變量的實際類型,并用實際類型來替換該變量的聲明,等同于我們在編碼時使用了實際類型聲明。而dynamic被編譯后是一個Object類型,編譯器編譯時不會對dynamic進行類型檢查。

  再說說Object,上面提到dynamic類型再編譯后是一個Object類型,同樣是Object類型,那么兩者的區(qū)別是什么呢?

  除了在編譯時是否進行類型檢查之外,另外一個重要的區(qū)別就是類型轉(zhuǎn)化,這也是dynamic很有價值的地方,dynamic類型的實例和其他類型的實例間的轉(zhuǎn)換是很簡單的,開發(fā)人員能夠很方便地在dyanmic和非dynamic行為間切換。任何實例都能隱式轉(zhuǎn)換為dynamic類型實例,見下面的例子:

dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();

反之亦然,類型為dynamic的任何表達式也能夠隱式轉(zhuǎn)換為其他類型。

int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;

dynamic與反射  

以前我們這樣使用反射:

public class DynamicSample
{
 public string Name { get; set; }
 
 public int Add(int a, int b)
 {
  return a + b;
 }
}
DynamicSample dynamicSample = new DynamicSample();
 //create instance為了簡化演示,我沒有使用反射
var addMethod = typeof(DynamicSample).GetMethod("Add");
int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

現(xiàn)在,我們有了簡化的寫法:

dynamic dynamicSample2 = new DynamicSample();
int re2 = dynamicSample2.Add(1, 2);

我們可能會對這樣的簡化不以為然,畢竟看起來代碼并沒有減少多少,此方法也不能使用 IntelliSense,但是,如果考慮到效率兼優(yōu)美兩個特性,那么dynamic的優(yōu)勢就顯現(xiàn)出來了。編譯器對dynamic進行了優(yōu)化,比沒有經(jīng)過緩存的反射效率快了很多。

以上就是淺析C# Dynamic關(guān)鍵字的詳細內(nèi)容,更多關(guān)于C# Dynamic關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#9新特性init only setter的使用

    C#9新特性init only setter的使用

    這篇文章主要介紹了C#9新特性init only setter的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C# 如何使用 Index 和 Range 簡化集合操作

    C# 如何使用 Index 和 Range 簡化集合操作

    這篇文章主要介紹了C# 如何使用 Index 和 Range 簡化集合操作,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-02-02
  • c#中如何去除字符串左邊的0

    c#中如何去除字符串左邊的0

    這篇文章主要介紹了c#中如何去除字符串左邊的0問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 一篇文章說通C#中的異步迭代器

    一篇文章說通C#中的異步迭代器

    這篇文章主要給大家介紹了如何通過一篇文章說通C#中的異步迭代器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 使用WPF實現(xiàn)加載動畫效果

    使用WPF實現(xiàn)加載動畫效果

    在應(yīng)用程序加載大量數(shù)據(jù)或執(zhí)行復(fù)雜操作時,為用戶提供一個良好的加載體驗變得至關(guān)重要,加載動畫是其中一個有效的方式,下面我們就來看看如何使用WPF實現(xiàn)簡單的加載動畫效果吧
    2024-03-03
  • C#七大經(jīng)典排序算法系列(上)

    C#七大經(jīng)典排序算法系列(上)

    這篇文章主要為大家詳細介紹了C#七大經(jīng)典排序算法系列上篇,冒泡排序,快速排序等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • c# 基于任務(wù)的異步編程模式(TAP)

    c# 基于任務(wù)的異步編程模式(TAP)

    這篇文章主要介紹了c# 基于任務(wù)的異步編程模式(TAP)的相關(guān)資料,幫助大家更好的理解和學習c# 異步編程的相關(guān)知識,感興趣的朋友可以了解下
    2020-11-11
  • C# WinForm編寫一個六邊形菜單

    C# WinForm編寫一個六邊形菜單

    這篇文章主要為大家詳細介紹了如何利用C# WinForm編寫一個六邊形菜單,文中的示例代碼講解詳細,具有一定的學習價值,有興趣的可以參考下
    2023-09-09
  • WPF實現(xiàn)自定義Panel面板的示例詳解

    WPF實現(xiàn)自定義Panel面板的示例詳解

    WPF中的Panel(面板),是繼承自FrameworkElement的抽象類,表示一個可以用來排列子元素的面板,本文主要來和大家聊聊WPF如何實現(xiàn)自定義Panel,感興趣的可以了解下
    2023-09-09
  • C#調(diào)用百度翻譯API實現(xiàn)一個翻譯功能

    C#調(diào)用百度翻譯API實現(xiàn)一個翻譯功能

    一直喜歡用Google Translate API進行在線翻譯,但是服務(wù)越來越慢這篇文章,所以只能換一個了,主要給大家介紹了關(guān)于C#調(diào)用百度翻譯API實現(xiàn)一個翻譯功能的相關(guān)資料,需要的朋友可以參考下
    2021-06-06

最新評論