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

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

開發(fā) 后端
隨著WEB開發(fā)的大行其道,各種動態(tài)語言也借著這股東風,蓬勃發(fā)展起來。在軟件開發(fā)界,動態(tài)語言正在被越來越多的人所接受和使用?!拔磥韺儆趧討B(tài)語言”似乎正在從一個預言成為一個現(xiàn)實。C#自然不會錯過這個技術(shù)發(fā)展的機會,她正在通過不斷引入新的動態(tài)語言特性,使自己變得越來越美麗“動”人。

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

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

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類型來表示這兩種飲料。我們寫一個函數(shù)GetDrink(),根據(jù)用戶不同的選擇返回不同的對象。

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對象調(diào)用任何方法,即使這個方法根本不存在,編譯器也不會在編譯的時候報編譯錯誤。只有在運行的時候,它才會檢查這個對象的實際類型,并檢查在它上面GetName()是什么意思。動態(tài)類型將使得C#可以以更加統(tǒng)一而便利的形式表示下列對象:

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

◆ 通過IDispatch訪問的COM對象

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

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

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

下面,我們就以一個具體實例SilverlightSolution,來演示C# 4.0中的動態(tài)編程是如何簡化對Silverlight應用程序中HTML DOM對象的訪問的。

1. 安裝Silverlight 2 runtime和SDK

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

Silverlight 2 RTW runtime

Silverlight 2 RTW SDK

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

2. 下載實例項目SilverlightSolution

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

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

下載這個實例程序包,然后將我們需要的項目SilverlightSolution解壓到C盤根目錄下。

3. 編譯并運行實例項目

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

 
圖1 初始頁面

#p#

4. 添加對HTML DOM對象的動態(tài)訪問

我們在Page類中添加兩個dynamic類型的對象doc和win,分別表示當前頁面和窗口,修改后Page類如下:

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

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

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

5. 添加Virtual Earth Jscript控件

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

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

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

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

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

在Page類中添加如下代碼控制Virtual Earth控件,以實現(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);
        }

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

 

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

public void Init()
{
          GetMap();
}

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

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

7. 編譯解決方案

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

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

【編輯推薦】

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

2009-07-02 10:07:24

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

2009-08-26 14:05:19

C#值類型和引用類型

2011-08-22 09:34:50

Objective-C多態(tài)動態(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#動態(tài)調(diào)用WebSe

2013-07-09 14:41:58

C動態(tài)類型

2009-08-10 14:55:04

C#定義Nullabl

2022-01-14 07:56:39

C#動態(tài)查詢

2009-06-24 17:32:40

動態(tài)加載AppDoma

2009-09-02 10:58:02

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

2009-08-03 15:06:43

C# Stack對象C# Queue對象

2009-08-03 18:24:28

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

2009-09-17 18:07:22

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

2009-09-02 11:02:57

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

2010-08-19 09:51:00

C# 4

2009-09-17 17:40:36

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

2009-09-17 17:44:51

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

2009-08-12 16:01:32

C#動態(tài)改變數(shù)據(jù)
點贊
收藏

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

主站蜘蛛池模板: 日韩国产中文字幕 | 黄视频网址 | 欧美日韩精品一区二区天天拍 | 手机看片1 | 亚洲va国产日韩欧美精品色婷婷 | 午夜视频免费在线观看 | 欧美黄色片 | 欧美福利视频 | 日韩快播电影 | 国产精品一区二区久久精品爱微奶 | 蜜桃视频成人 | 天堂成人国产精品一区 | 综合久久一区 | 国产一区二区三区免费观看在线 | 国产成人精品一区二区三区 | 又黄又爽的网站 | 瑞克和莫蒂第五季在线观看 | 伊人一二三 | 99久久夜色精品国产亚洲96 | 狠狠干美女| 一区二区三区久久 | 日韩日韩日韩日韩日韩日韩日韩 | 91综合网| 午夜视频一区二区 | 日韩精品区| 欧美一级久久精品 | 日韩av免费在线观看 | 国产日韩欧美在线播放 | 午夜影院在线免费观看视频 | 国产91亚洲精品一区二区三区 | 一区二区三区av | 久久日韩粉嫩一区二区三区 | 在线视频中文字幕 | 午夜影院在线观看 | 婷婷久久久久 | 国产在线拍偷自揄拍视频 | 成人久久久久久久久 | 日韩欧美国产成人一区二区 | 精品一区二区电影 | 亚洲成av人片在线观看无码 | 蜜臀久久99精品久久久久野外 |