亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

  一般而言,動(dòng)態(tài)語(yǔ)言在編譯時(shí)不會(huì)對(duì)類型進(jìn)行檢查,而是在運(yùn)行時(shí)識(shí)別對(duì)象的類型。這種方法有利有弊:代碼編寫(xiě)起來(lái)更快、更容易,但無(wú)法獲取編譯器錯(cuò)誤,只能通過(guò)單元測(cè)試和其他方法來(lái)確保應(yīng)用正常運(yùn)行。

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

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

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

dynamic、Object還是Var?

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

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

  var實(shí)際上編譯器拋給我們的語(yǔ)法糖,一旦被編譯,編譯器就會(huì)自動(dòng)匹配var變量的實(shí)際類型,并用實(shí)際類型來(lái)替換該變量的聲明,等同于我們?cè)诰幋a時(shí)使用了實(shí)際類型聲明。而dynamic被編譯后是一個(gè)Object類型,編譯器編譯時(shí)不會(huì)對(duì)dynamic進(jìn)行類型檢查。

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

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

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

反之亦然,類型為dynamic的任何表達(dá)式也能夠隱式轉(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為了簡(jiǎn)化演示,我沒(méi)有使用反射
var addMethod = typeof(DynamicSample).GetMethod("Add");
int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

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

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

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

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

相關(guān)文章

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

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

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

    C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作

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

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

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

    一篇文章說(shuō)通C#中的異步迭代器

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

    使用WPF實(shí)現(xiàn)加載動(dòng)畫(huà)效果

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

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

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

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

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

    C# WinForm編寫(xiě)一個(gè)六邊形菜單

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

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

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

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

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

最新評(píng)論