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

.NET動靜結合編程 接口和委托的約束強度

開發 后端
程序世界有兩種神秘的元素,它們無處不在,卻常常未被察覺。它們一動一靜,卻又和諧相處。我給這對兄弟取上不太恰當的名字,一個叫“協議”,一個叫“約束”。我們常常看到的動態語言、靜態語言背后,本質上就是“協議”與“約束”兩種元素的作用。

靜態語言和動態語言本身沒有一個明確的界限,它們各有優勢,又各有不足。

C#是一門優美的語言,它融合了靜態和動態的優勢,如果運用得當,必能動靜結合,呈現出一種和諧之美。特別是.NET平臺和語言的快速發展,更展現了動靜結合編程的活力。本篇是.NET動靜結合編程的第一篇,希望這個系列能和大家一起探討如何在.NET平臺上最大限度的發揮動靜結合的潛能。本人還只是.NET的初學者,對計算機理論的理解還很膚淺,文中錯誤歡迎批評指正,不足之處歡迎補充,謝謝!

被忽略的協議

談到“協議”,最先浮現在我們腦海中的可能是TCP/IP協議棧,但其實我們隨處都在和協議打交道。下面的例子,你看出協議來了嗎?

B(){
    ArrayList lst = A();
    foreach (string item in lst){
        Console.WriteLine(item.Length);
    }
}

方法B假定方法A遵守:返回的ArrayList內部都是string類型的元素。這就是它們之間的協議,這個協議不受編譯器靜態檢查的約束。所以,協議意味著運行時的不確定性,方法A完全可能在返回結果中裝入非string類型的元素,而這將導致B在運行時產生異常。 .NET2.0通過泛型集合增加了靜態類型約束:

B(){
    List lst = A();
    foreach (string item in lst){
        Console.WriteLine(item);
    }
}

這樣,B再也不用擔心lst內部存在非string類型的元素了,一切得益于泛型為A加上的靜態類型約束。

約束有強弱

約束有強弱之分。越強的約束越安全,靜態性越強,受編譯器的支持越大;反之,越弱的約束,動態性越強,運行時靈活性越大。常常看到關于單方法接口和委托異同的討論,不少朋友認為它們完全等價。其實,它們有明顯不同的約束強度。接口是靜態類型約束,而委托只是靜態簽名約束,二者的強度完全不同。換句話說,委托具有更多的協議性,只要符合簽名,都可以被委托調用,而能被接口調用的對象必須實現該接口。

來看一個例子:需要編寫一個類A,其內部需要日志功能;A采用IoC方式,不依賴于具體的Logger類,由使用者根據需要注入具體的實現;同時,A的使用者B,希望采用第三方的Logger類。

a. 基于接口的IoC

interface ILogger { void Write(string msg); }

class A{
    ILogger Logger { get; set; }
    void F() {}
}

class B{
    G(){
        A a = new A();
        a.Logger = new LogAdapter(); //注入依賴
        a.F();
    }
}

//對第3方Logger進行包裝
class LogAdapter : ILogger{
    Write(string msg){//這里調用第3方的Logger類}
}

b. 基于委托的IoC

class A{
    Action Logging { get; set; }
    void F() {}
}

class B{
    G(){
        A a = new A();
        a.Logging = delegate(string msg){ //調用第3方Logger類 };
        a.F();
    }
}

比較上面兩個例子,我們就會發現委托比接口的約束要弱得多,使用起來靈活得多。基于接口的實現不得不增加一個Adapter去機械地適應接口的類型約束,而基于委托的實現只需要保證方法簽名約束即可。

博文鏈接http://www.cnblogs.com/weidagang2046/archive/2009/03/11/1408636.html

【編輯推薦】

  1. 深入解析C#編程中的方法重載
  2. 使用.NET Array類的Sort方法分類數值
  3. 詳解C# 4.0中必選參數與可選參數混合的問題
責任編輯:彭凡 來源: cnblog
相關推薦

2009-03-27 09:26:20

定義Duck TypingC#

2009-09-08 15:28:24

C#委托

2010-08-03 08:52:23

委托接口

2011-05-20 16:33:47

委托接口

2011-06-16 15:14:17

VB.NET事件委托

2009-09-02 17:51:36

.NET委托

2009-08-26 17:05:55

.NET委托

2009-08-05 17:04:14

.NET委托

2009-10-15 09:12:29

.NET委托

2009-08-18 11:08:24

.Net Framew

2013-03-12 13:52:56

編程

2024-06-28 10:19:02

委托事件C#

2021-01-13 10:40:42

編程語言PLCGraph

2010-01-05 18:21:33

.NET Framew

2009-08-03 13:23:04

C#編程組件-事件-委托

2009-03-26 10:11:47

2012-04-16 13:22:56

CORBAJavaC++

2009-07-20 09:53:43

Java混合編程

2022-01-07 08:24:13

STM32枚舉結構體

2010-09-01 17:13:07

SQL刪除約束
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线亚洲人成电影网站色www | 亚洲视频免费在线观看 | 羞羞视频在线观免费观看 | 作爱视频免费观看 | 亚洲第一在线 | 日韩一二三 | 99这里只有精品视频 | 精品日韩一区二区 | 国产农村妇女毛片精品久久麻豆 | 亚洲午夜精品视频 | 国产原创视频 | 日本一区二区高清视频 | 国产精品日韩欧美一区二区三区 | 一区二区在线免费观看视频 | 欧美在线视频网 | 国产精品一区二区免费 | 中文字幕视频在线免费 | 亚洲视频中文字幕 | 成年视频在线观看 | 久久精品国产亚洲一区二区 | 在线啊v | 最新中文字幕一区 | 亚洲成av | 毛片免费观看 | 粉嫩高清一区二区三区 | 91在线最新 | 激情五月综合 | 一区二区三区视频在线 | 自拍偷拍亚洲一区 | 亚洲免费一区二区 | 精品国产一区二区三区免费 | 成人毛片在线观看 | 亚洲色片网站 | 国产亚洲精品综合一区 | 美女露尿口视频 | 一区二区视频在线观看 | 久久三区 | 在线视频亚洲 | 欧美日韩在线播放 | 国产日屁| 亚洲精品一区二区三区中文字幕 |