成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C# 4.0中的動(dòng)態(tài)類型和動(dòng)態(tài)編程

開發(fā) 后端
隨著WEB開發(fā)的大行其道,各種動(dòng)態(tài)語言也借著這股東風(fēng),蓬勃發(fā)展起來。在軟件開發(fā)界,動(dòng)態(tài)語言正在被越來越多的人所接受和使用。“未來屬于動(dòng)態(tài)語言”似乎正在從一個(gè)預(yù)言成為一個(gè)現(xiàn)實(shí)。C#自然不會(huì)錯(cuò)過這個(gè)技術(shù)發(fā)展的機(jī)會(huì),她正在通過不斷引入新的動(dòng)態(tài)語言特性,使自己變得越來越美麗“動(dòng)”人。

C# 4.0的主題就是動(dòng)態(tài)編程(Dynamic Programming)。雖然C#仍然是一種靜態(tài)語言,但是對(duì)象的意義開始變得越來越“動(dòng)態(tài)”。它們的結(jié)構(gòu)和行為無法通過靜態(tài)類型來捕獲,或者至少編譯器在編譯程序時(shí)無法得知對(duì)象的結(jié)構(gòu)和行為。

C#引入了一種新的靜態(tài)類型”dynamic”,當(dāng)你擁有了一個(gè)dynamic類型的對(duì)象后,你“對(duì)它做的事情”只會(huì)在運(yùn)行時(shí)進(jìn)行解析。設(shè)想我們擁有這樣兩個(gè)類,分別表示兩種飲料:

public class Coffee
    {
        public string GetName()
        {
            return "You selected Maxwell coffee.";
        }
    }
public class Juice
    {
        public string GetName()
        {
            return "You selected orange juice.";
        }
    }

現(xiàn)在,我們就可以用dynamic類型來表示這兩種飲料。我們寫一個(gè)函數(shù)GetDrink(),根據(jù)用戶不同的選擇返回不同的對(duì)象。

static private Object GetDrink(int i)
{
   if (i == 1)
   {
   return new Juice();
   }
   else  // default
   {
   return new Coffee();
   }
}
static void Main(string[] args)
{
  Console.WriteLine("Please Select Your Drink: 1 -- Juice; 2 -- Coffee");
  int nDrinkType = Console.Read();
  dynamic drink = GetDrink( nDrinkType );
  Console.WriteLine( drink.GetName() );
}

C#編譯器允許你通過dynamic對(duì)象調(diào)用任何方法,即使這個(gè)方法根本不存在,編譯器也不會(huì)在編譯的時(shí)候報(bào)編譯錯(cuò)誤。只有在運(yùn)行的時(shí)候,它才會(huì)檢查這個(gè)對(duì)象的實(shí)際類型,并檢查在它上面GetName()是什么意思。動(dòng)態(tài)類型將使得C#可以以更加統(tǒng)一而便利的形式表示下列對(duì)象:

◆ 來自動(dòng)態(tài)編程語言——如Python或Ruby——的對(duì)象

◆ 通過IDispatch訪問的COM對(duì)象

◆ 通過反射訪問的一般.NET類型

◆ 結(jié)構(gòu)發(fā)生過變化的對(duì)象——如HTML DOM對(duì)象

當(dāng)我們得到一個(gè)動(dòng)態(tài)類型的對(duì)象時(shí),不管它是來自COM還是IronPython、HTML DOM還是反射,只需要對(duì)其進(jìn)行操作即可,動(dòng)態(tài)語言運(yùn)行時(shí)(DLR)會(huì)幫我們指出針對(duì)特定的對(duì)象以及這些操作的具體意義。這將給我們的開發(fā)帶來極大的靈活性,并且能夠極大程度上地精簡(jiǎn)我們的代碼。

下面,我們就以一個(gè)具體實(shí)例SilverlightSolution,來演示C# 4.0中的動(dòng)態(tài)編程是如何簡(jiǎn)化對(duì)Silverlight應(yīng)用程序中HTML DOM對(duì)象的訪問的。

1. 安裝Silverlight 2 runtime和SDK

為了運(yùn)行這個(gè)實(shí)例,我們需要安裝Silverlight 2 runtime和SDK。這些都可以從微軟的網(wǎng)站上直接下載:

Silverlight 2 RTW runtime

Silverlight 2 RTW SDK

另外,因?yàn)閂isual Studio 2010跟Silverlight的一些已知的兼容性問題,我們還需要一個(gè)擁有管理員權(quán)限的賬號(hào)來運(yùn)行Visual Studio 2010 CTP。

2. 下載實(shí)例項(xiàng)目SilverlightSolution

為了演示C# 4.0的諸多新特性,微軟通過MSDN Code Gallery發(fā)布了一個(gè)演示C#新特性的實(shí)例程序包,我們用到的實(shí)例項(xiàng)目SilverlightSolution就在這個(gè)程序包中。我們可以訪問:

http://code.msdn.microsoft.com/csharpfuture

下載這個(gè)實(shí)例程序包,然后將我們需要的項(xiàng)目SilverlightSolution解壓到C盤根目錄下。

3. 編譯并運(yùn)行實(shí)例項(xiàng)目

我們用管理員身份啟動(dòng)Visual Studio CTP,然后打開SilverlightSolution項(xiàng)目,如果一切正常,我們可以得到一個(gè)空的Silverlight程序頁面:

 
圖1 初始頁面

#p#

4. 添加對(duì)HTML DOM對(duì)象的動(dòng)態(tài)訪問

我們?cè)赑age類中添加兩個(gè)dynamic類型的對(duì)象doc和win,分別表示當(dāng)前頁面和窗口,修改后Page類如下:

public partial class Page : UserControl
        {
        // 添加的代碼
            dynamic doc = HtmlPage.Document.AsDynamic();
            dynamic win = HtmlPage.Window.AsDynamic();
        //…
}

然后,我們修改Page類的函數(shù)btnSearch_Click(),當(dāng)用戶點(diǎn)擊”Get All”按鈕后,更加用戶搜索的內(nèi)容,修改窗口的標(biāo)題。

void btnSearch_Click(object sender, RoutedEventArgs e)
        {
                doc.Title = "Pictures of " + txtTag.Text;
                lstPictures.ItemsSource = Source.LoadItems();
        }

5. 添加Virtual Earth Jscript控件

打開解決方案中的測(cè)試頁StartPage.htm,在<title>標(biāo)簽的前面添加如下Jave Script代碼,引用Virtual Earth控件:

<script type="text/javascript" src="http://dev.virtualearth.net
/mapcontrol/mapcontrol.ashx?v=6.1"/>

然后,在<body>標(biāo)簽中添加如下代碼,定義地圖控件的位置和大小:

通過簡(jiǎn)單的兩步,我們就完成了對(duì)測(cè)試頁面的修改。接下來的工作就是通過C#訪問和控制Virtual Earth控件了。

6. 用C#代碼控制Virtual Earth控件

在Page類中添加如下代碼控制Virtual Earth控件,以實(shí)現(xiàn)獲取地圖,添加Pin的功能:

dynamic map = null;
        void GetMap()
        {
                map = win.New.VEMap("myMap");
                map.LoadMap();
        }
        void AddPin(Item item)
        {
                dynamic loc = win.New.VELatLong(item.Latitude, item.Longitude);
                var pin = map.AddPushpin(loc);
                pin.SetTitle(item.Title);
                pin.SetDescription(item.Description);
                map.SetCenterAndZoom(loc, 7);
        }

憶苦才能思甜。為了體會(huì)動(dòng)態(tài)編程給我們帶來的便利,我們來看看在沒有動(dòng)態(tài)類型的C# 3.0中,AddPin()函數(shù)應(yīng)該如何實(shí)現(xiàn)。如果是在C# 3.0中,我們的doc,win和map 都將是靜態(tài)類型,為了執(zhí)行這些對(duì)象的某些方法,需要進(jìn)行顯式的類型轉(zhuǎn)換,同時(shí),還需要將方法名作為字符串傳遞以實(shí)現(xiàn)方法的調(diào)用。很明顯,C# 3.0中的實(shí)現(xiàn)過程非常繁瑣,而C# 4.0中的實(shí)現(xiàn)是如此的優(yōu)雅而自然。

void AddPin(Item item)
  {
ScriptObject loc = win.CreateInstance("VELatLong", item.Latitude, item.Longitude);
ScriptObject pin = (ScriptObject)map.Invoke("AddPushpin", loc);
pin.Invoke("SetTitle", item.Title);
pin.Invoke("SetDescription", item.Description);
map.Invoke("SetCenterAndZoom", loc, 7);
}

 

最后,我們需要在適當(dāng)?shù)奈恢谜{(diào)用這兩個(gè)函數(shù),以實(shí)現(xiàn)地圖的加載和Pin的添加。在Page類的Init()函數(shù)中添加GetMap()函數(shù)調(diào)用:

public void Init()
{
          GetMap();
}

另外,在lstPictures_SelectionChanged()函數(shù)中添加AddPin()函數(shù),當(dāng)用戶選擇的圖片變化后,重新獲取Pin的位置并添加到地圖上:

void lstPictures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
          Item selected = lstPictures.SelectedItem as Item;
          AddPin(selected);
}

7. 編譯解決方案

到這里為止,我們對(duì)項(xiàng)目的修改就全部完成了。重新編譯整個(gè)解決方案,我們可以看到添加Virtual Earth控件后的頁面。當(dāng)我們?cè)谧髠?cè)列表中選擇圖片后,Pin會(huì)定位到這幅圖片拍攝的地點(diǎn),當(dāng)我們把鼠標(biāo)移動(dòng)到Pin上時(shí),則會(huì)顯示圖片和更多的相關(guān)信息。

 
圖2 添加Virtual Earth控件后的頁面

【編輯推薦】

  1. C# 4.0 的4個(gè)新特性
  2. C# 4.0新功能和展望
  3. C# 4.0中的動(dòng)態(tài)類型與編程技巧
責(zé)任編輯:楊鵬飛 來源: IT168
相關(guān)推薦

2009-07-02 10:07:24

C# 4.0的動(dòng)態(tài)類型Visual Stud

2009-08-26 14:05:19

C#值類型和引用類型

2011-08-22 09:34:50

Objective-C多態(tài)動(dòng)態(tài)類型

2009-08-26 15:46:01

C#匿名類型

2009-08-06 15:30:23

C#類型系統(tǒng)

2009-08-26 10:34:15

C#類型C#變量

2009-08-11 14:26:56

C#動(dòng)態(tài)調(diào)用WebSe

2013-07-09 14:41:58

C動(dòng)態(tài)類型

2022-01-14 07:56:39

C#動(dòng)態(tài)查詢

2009-06-24 17:32:40

動(dòng)態(tài)加載AppDoma

2009-08-10 14:55:04

C#定義Nullabl

2009-09-02 10:58:02

C#動(dòng)態(tài)數(shù)組

2009-08-03 15:06:43

C# Stack對(duì)象C# Queue對(duì)象

2009-08-03 18:24:28

C# 4.0協(xié)變和逆變

2009-09-17 18:07:22

C#動(dòng)態(tài)數(shù)組

2009-09-02 11:02:57

C#動(dòng)態(tài)數(shù)組

2010-08-19 09:51:00

C# 4

2009-02-05 15:32:23

接口委托

2009-09-17 17:40:36

C#動(dòng)態(tài)數(shù)組

2009-09-17 17:44:51

C#動(dòng)態(tài)數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜影视在线观看 | 久久综合欧美 | 黄色大片网 | 国产视频第一页 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 成人免费看黄网站在线观看 | 国产精品日本一区二区不卡视频 | 日韩欧美在线观看一区 | 欧美精品导航 | 精品国产乱码久久久久久闺蜜 | 国产a区 | 欧美日韩国产高清视频 | 精品国产乱码一区二区三区a | 久久天堂网 | 99tv成人影院 | 日韩看片| 国产一区二区三区在线看 | 亚洲一区二区三区免费视频 | 国产综合精品一区二区三区 | 啪啪精品 | 老司机精品福利视频 | 中文字幕蜜臀av | 亚洲+变态+欧美+另类+精品 | 91在线影院| 午夜播放器在线观看 | 成人免费福利 | 男女网站免费观看 | 成人在线视 | 久久99网| 米奇狠狠鲁 | 国产成人精品一区二区三区网站观看 | 日韩av免费在线电影 | 国产麻豆一区二区三区 | 久久久久国产精品一区 | 国产成人一区 | 国产成人免费视频网站高清观看视频 | 日韩成人在线观看 | 黄色一级大片在线免费看产 | 日韩一级 | 午夜精品一区二区三区在线观看 | 日韩一级免费看 |